Spring boot 自动装配原理

上一篇Spring boot 回顾。这一篇我们看一下Spring boot 自动装配的原理。

1. 简单的 Bean 装配

@Data
public class Student {
    private String name;
    private int age;
}

@Configuration
public class SingleConfiguration {

    @Bean
   public Student student(){
    Student student=new Student();
    student.setName("zhangsan");
    student.setAge(30);
   return student;
}

// 验证
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(SingleConfiguration.class);
Student student= (Student) context.getBean("student");

2. 匹配 Bean 装配

通过 @ComponentScan 注解扫描包路径,实现匹配 Bean 扫描装配

@Configuration
@ComponentScan("com.xx.xx")
public class BatchConfiguration {

}

3. Spring boot 各种 starter 怎么装配

约定优于配置

starter 需要做
1 )创建 META-INF/spring.factories 文件
2 )通过指定的 key ,把配置类的信息进行配置,比如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xx.Mybati
sAutoConfiguration
3 )看看其他 starter ,比如: mybatis nacos
对于 Spring Boot 项目而言,目的就是寻找所有 starter 中指定配置文件中的配置类:
1 @SpringBootApplication->@EnableAutoConfiguration-
>@Import(AutoConfigurationImportSelect.class)
2 AutoConfigurationImportSelect#getAutoConfigurationEntry-
>getCandidateConfigurations

条件装配:

满足特定的条件,Bean 才会被注入到 Ioc 容器中。

大家可能有发现过这种现象,项目依赖了 xxx-starter,而且 xxx-starter 里自身使用的某些依赖我们没有引入。但是项目可以正常启动。为啥呢?原因是 xxx-starter 没有满足条件,没有装配。

条件装配有以下注解:

1 ConditionalOnClass :当且仅当 ClassPath 存在指定的 Class 时,才创建标记上该注解的类的实例
2 ConditionalOnBean: 当且仅当指定的 bean classes and/or bean names 在当前容器中 , 才创建
标记上该注解的类的实例
3 ConditionalOnProperty :当且仅当 Application.properties 存在指定的配置项时,创建标记上
了该注解的类的实例
4 ConditionalOnResource :在 classpath 下存在指定的 resource 时创建
5 ConditionalOnWebApplication :在 web 环境下创建

你可能感兴趣的:(spring,boot,java,spring,分布式)