上一篇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 环境下创建