一.IOC条件注解
1.@ConditionalOnProperty
value设置配置项key,havingValue设置生效值,matchIfMissing代表配置项不存在是否代表生效(默认false)
2.@ConditionalOnClass/@ConditionMissingClass
当项目包含/不包含某个类,bean生效
应用场景:通过判断导入的数据库驱动,生成对应数据库连接bean
3.@ConditionalOnBean/@ConditionalOnMissingBean
当容器存在指定bean,该bean也生效
二.IOC生命周期回调
1.Bean初始化回调
(1).基于@PostConstruct
(2).基于InitializingBean接口,实现方法
(3).基于@Bean(initMethod = "方法名")指定初始化方法
三种形式同时存在,执行顺序:
(1) -> (2) -> (3)
2.Bean销毁回调
(1).基于@PreDestroy
(2).基于DisposableBean接口,实现方法
(3).基于@Bean(destroyMethod = "方法名")指定销毁方法
三种形式同时存在,执行顺序:
(1) -> (2) -> (3)
三.IOC循环依赖
1.概念
创建A时,发现A需要注入B,转而创建B,发现B又需要注入A,转而创建A...,进入一个死循环
//A.java
@Component
public class A {
@Resource
private B b;
}
//B.java
@Component
public class B {
@Resource
private A a;
}
2.解决办法
(1).配置文件添加spring.main.allow-circular-references=true以全局允许(只适用@Component + @Resource)
(2).从代码设计层面,修改类的关系,避免循环依赖(引入中间类)
(3).添加@Lazy,@Lazy将bean推迟到ioc加载后创建,可以避开该问题
//A.java
@Component
public class A {
private B b;
public A(@Lazy B b) {
this.b = b;
}
}
//B.java
@Component
public class B {
private A a;
public B(@Lazy A a) {
this.a = a;
}
}