Spring中,一般使用xml来配置bean注入容器。
然而在SpringBoot中,使用Java配置类来进行bean的注入。
@Configuration
告诉SpringBoot这是一个配置类 == 配置文件
@Bean 给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例。
1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
2、配置类本身也是组件
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
Full模式与Lite模式
@Configuration(proxyBeanMethods = true)
表示full模式,意思是,代理bean的方法,保证每个@Bean方法被调用多少次返回的组件都是单实例的,配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
@Configuration(proxyBeanMethods = false)
每个@Bean方法被调用多少次返回的组件都是新创建的,配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
@Component、@Controller、@Service、@Repository
除了用Java配置类来代替xml配置注入容器。原本spring中的一些自动注入注解仍然能用。只要被注解的类的路径和启动类是桶一个路径下,就能被扫描到,那么这些利用这些注解来注入容器就依然能够生效。
@Import
@Import({User.class, DBHelper.class})
这个注解加在Java配置类上,把类的class写入就能注入容器,给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名。
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
相当于给组件注入容器前多一个判断
可以加在某个bean上,符合条件才注入。也可以直接加在Java配置类上,不符合条件的话,所有都不注入。
@ConditionalOnMissingBean(name = "tom")
@Configuration
public class MyConfig {
@ConditionalOnMissingBean(name = "tom")
@Bean("tom22")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
原生配置文件引入
@ImportResource
如果有xml配置文件的话,再把所有xml注入的bean全部移植进Java配置类就太麻烦了,因此,可以用@ImportResource直接将原来的xml配置文件直接导入到Java配置类,使原本的xml中的组件也能注入SpringBoot。
@ImportResource("classpath:beans.xml")
@Configuration
public class MyConfig {}
配置绑定
当向容器中注入bean的时候如果想要给bean赋初值的话,SpringBoot的强大之处就在于,只有一个总的配置文件,那么就可以用@ConfigurationProperties注解,去唯一的配置文件中,找到相应属性,给bean赋初值后,再注入容器中。
例如:配置文件中有
mycar.brand=xxx
mycar.price=xxx
一、@Component + @ConfigurationProperties
相当于用Spring中的@Component注入容器
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@EnableConfigurationProperties + @ConfigurationProperties
如果只在类上加@ConfigurationProperties,不加@Component,那么,还可以用Java配置类进行注入容器,此时需要@EnableConfigurationProperties注解,添加到Java配置类上面,就能自动为Car类赋初值,并且自动注入容器,就不需要在配置类里面写@Bean了。
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
@EnableConfigurationProperties(Car.class)
@Configuration
public class MyConfig {
}
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}