作用:
1.给Spring容器注册组件,相当于之前在spring的xml文件中注册组件
2.被@Configuration标记的类被标记为一个配置类,相当于一个xml文件
3.@bean(“别名”)注解可以给注册的组件命名别名
4.@Configuration默认是单例,无论获取多少次都是一个对象
5.配置类本身也是一个组件。
6.@Configuartion自spring5.2版本后添加了一个属性proxyBeanMethods,含义是,是否启动代理模式,当启动时,容器中只有一个容器中注册的对象,当不启动时,即proxyBeanMethods = false时,每获取一次容器中注册的组件,都会产生一个新的对象。这个属性一般用来解决组件之间的依赖问题,当容器中注册的组件要依赖容器中注册的其他组件时,一般使用代理模式,保证所依赖的对象就是容器中所注册的组件。
例子1:下面是一个配置类
@Configuration
public class MyConfig01 {
@Bean
public Pat getPat(){
return new Pat("小狗","欢欢",2);
}
@Bean("user001")
public User getUser(){
return new User("加里奥",28);
}
}
例子2:@Configuration的两种模式,当proxyBeanMethods = true时,是单例模式,当proxyBeanMethods = flase时,每获取一次容器中注册的对象,都会产生一个新的对象。
@Configuration(proxyBeanMethods = true)
public class MyConfig02 {
@Bean("root")
public User getUser(){
User xiaoming = new User("小明", 18);
xiaoming.setPat(getPat());//这个组件依赖下面的Pat
return xiaoming;
}
@Bean
public Pat getPat(){
return new Pat("奥斯卡","小狗",1);
}
}
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestApplication.class, args);
User root = run.getBean(User.class);
Pat pat = run.getBean(Pat.class);
System.out.println(pat == root.getPat());//当proxyBeanMethods = true时打印true,当roxyBeanMethods = false时,返回false
}
2.@ipmort另外这些注解@Bean、@Controller、@Repository、@Service、@Component也可以实现向容器中注册组件的功能,还有@ComponentScan通过指定扫描的包,也会将包下的所有类注册到容器中
1.@ipmort可以配合其他向容器中注册组件的注解使用,例如:@Configuration、@Bean、@Controller、@Repository、@Service、@Component
2.使用@Ipmort注解可以导入任何组件,包括我们自己写的或者通过依赖导入的组件,在加载配置类时,会调用导入类的无参构造,给容器注册导入的组件。
例子:
@Import({User.class, Pat.class, DoubleAdder.class})
@Configuration
public class MyConfig03 {
}
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestApplication.class, args);
System.out.println(run.getBean(User.class));
System.out.println(run.getBean(Pat.class));
System.out.println(run.getBean(DoubleAdder.class));
}
3.@Conditional
1.条件注解,当满足某些条件时,才给容器注入某些注解
2…@Conditional是一个根注解,它下面有很多子注解,在使用时候,根据不同的条件使用,
例如:@ConditionalOnClass:当容器中有某个calss时才注入;@ConditionalOnWebApplication:当项目时一个web应用时才注入;@ConditionalOnBean:当容器中存在某个bean实例时才注入等等;
例子:
@ConditionalOnClass(Pat.class)
@Import(Pat.class)//如果不导入pat组件,则不会注册下面的user,但是Myconfg04依然会存在容器中
@Configuration()
public class MyConfig04 {
@Bean("root")
public User getUser(){
User xiaoming = new User("小明", 18);
return xiaoming;
}
}
4.@ImportResource
用于导入spring的配置文件
例子:
package com.example.springboottest.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:spring.xml")
public class MyConfig05 {
}
5.@ConfigurationProperties
1.用于配置绑定,一般用于将配置类中的属性和配置文件中的属性进行绑定
2.注意:只有在容器中的组件才可以进行配置绑定
例子:
application.yml:
datasource: name: xiaoming password: 123456
package com.example.springboottest.domin;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "datasource")//perfix表示配置文件中的前缀,另外属性名必须相同
public class DataSource {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
另一个属性配置注解@EnableConfigurationProperties
1.作用:在配置类中配置属性绑定,但是要指定开启谁的属性配置
2.这个注解可以用来配置没有注册到容器中的类
例子:
package com.example.springboottest.domin;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//@Component 不添加这个注解
@ConfigurationProperties(prefix = "datasource")
public class DataSource {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
//配置类
package com.example.springboottest.config;
import com.example.springboottest.domin.DataSource;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(DataSource.class)
public class MyConfig06 {
}



