SpringBoot容器功能

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
SpringBoot容器功能

条件装配:满足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;
    }
上一篇:汽车管理系统


下一篇:iOS - CALayer相关(CATransform3D)