springboot条件装配以及原理

@Conditional条件装配

@Conditional的关系树(在满足某种条件或者不满足某种条件创建组件等方法 可以使用在类前面)

springboot条件装配以及原理
springboot条件装配以及原理

我们在main方法里面尝试拿取一下组件

springboot条件装配以及原理

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传springboot条件装配以及原理

@ImportResource("classpath:beans.xml")可以导入以前xml的配置方式

我在spring.xml里面创建了一个组件如果直接拿那么结果是false因为springboot不知道它是是什么

如果在任何一个类上面加入@ImportResource(“classpath:beans.xml”)那么他会自动解析里面的组件放入springboot

<bean id="hh" class="com.springboot.bean.User">
    <property name="name" value="12"></property>
    <property name="age" value="11"></property>
</bean>
@ImportResource("classpath:beans.xml")//可以导入以前xml的配置方式

配置绑定

第一种在实例类上加上

prefix是前缀代表着前缀里面的属性和car里面的属性一致

@Component加入ioc容器

Car实例类

package com.springboot.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/*
* 只有在放在容器中才会生效
* */
@Component
@ConfigurationProperties(prefix = "mycard")
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;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

主配置文件

mycard.brand=BM
mycard.price=10000

测试

HelloController

使用自动装配

package com.springboot.controller;

import com.springboot.bean.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/*@ResponseBody(告诉springboot直接返回给浏览器)
@Controller*/
@RestController//就是@ResponseBody和@Controller
public class HelloController {


    @Autowired
    Car car;
    @RequestMapping("/card")
    public Car car(){
    return car;
    }
}

测试结果

springboot条件装配以及原理

第二种方法:因为我们可能引入的car为第三方的无法加入@Component导致无法导入配置文件

使用@EnableConfigurationProperties+@ConfigurationProperties(开启car配置绑定功能
把car这个组件自动注册到容器中)@EnableConfigurationProperties在主配置文件类使用

@EnableConfigurationProperties(Car.class)

运行结果
springboot条件装配以及原理

自动配置原理

引导加载自动装配

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

1.@SpringBootConfiguration:

​ Configuration代表这当前是一个配置类

2.@ComponentScan(指定扫面哪些注解)

3.@EnableAutoConfiguration

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage 自动配置包(指定了默认的包规则

@Import({Registrar.class})
//利用Registrar给容器种导入一系列组件
//将指定的包下的所有组件导入进来MainApplication所在的报下

@Import({AutoConfigurationImportSelector.class})

1.利用this.getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
 2.    List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入到容器中的配置类
  3.例如工厂加载
    List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)得到组件
 4.从META-INF/spring.factories位置来加载一个文件
    默认扫面我们当前系统里所有MET-INF/spring.factories位置的文件

springboot条件装配以及原理

这些组件在xml中已经写死了

springboot条件装配以及原理

按需开启自动配置项

1.当我们导入相关的jar包才会开启相应的组件

2.springboot会预先加载配置类

3.每个自动配置类按照条件生效

4.生效的配置类就会给容器中装配很对组件

5.只要容器中有这些组件,就相当于这些功能有了

6.只要用户有自己配置的,就以用户的优先

​ xxxxAutoConfiguration–>组件–>xxxProperties里面拿值—>application.properties

实战

引入场景依赖

https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot

查看自动配置了那些

​ 自己分析,引入场景对应的配置一般都会生效

​ 配置文件中的debug=true开启自动配置报告 Negative(不生效)

是否修改配置项

​ 参照文档修改配置项

​ https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties

​ 自己查看分析xxxproperties绑定了配置文件的那些

自定义加入或替换组件

上一篇:导航


下一篇:springboot @Validated分组功能用在service层校验对象解决方案