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