前提:四种将bean加载搭到spring容器的方式
1、@Configuration +@bean
2、@component
3、@import
4、META-INF/spring.factories 中的 key = org.springframework.boot.autoconfigure.EnableAutoConfiguration、
注:其中3、4也可以用于:a项目引入b项目的bean 这种场景
一、@Configuration+@Bean+@Lazy形式
@Configuration
public class BeanConfig {
@Bean
@Lazy(value = true)
public People people() {
return new People();
}
}
1、@Lazy(value = true):默认为true,不执行构造方法
2、@Lazy(value = false):执行构造方法
3、@Lazy():默认为true,不执行构造方法
4、无@Lazy:不执行构造方法
注:无论如何context.containsBean("people") 都为true。因为bean是方法三级缓存的map集合中,key=beanName可定是有了,value=bean可能没有。
二、@Component+@Lazy形式
@Component
@Lazy(value = true)
public class Animal {
public Animal() {
System.out.println("************你************");
}
}
1、@Lazy(value = true):默认为true,不执行构造方法
2、@Lazy(value = false):执行构造方法
3、@Lazy():默认为true,不执行构造方法
4、无@Lazy:执行构造方法
三、@Import+@Lazy形式
@Import(value = {God.class})
@Lazy(value=false)
public class God {
public God() {
System.out.println("****************他**************");
}
}
1、@Lazy(value = true):默认为true,不执行构造方法
2、@Lazy(value = false):执行构造方法
3、@Lazy():默认为true,不执行构造方法
4、无@Lazy:执行构造方法
四、classpath下的META-INF/spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
config.DogConfig,\
entity.Sheep
1、@Lazy(value = true):默认为true,不执行构造方法
2、@Lazy(value = false):执行构造方法
3、@Lazy():默认为true,不执行构造方法
4、无@Lazy:执行构造方法
五、后处理Bean
1、可以加一个后处理Bean
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
前方法();
后方法();
}
2、后处理Bean的前方法、后方法伴随着构造方法执行。要执行都执行,要不执行都不执行
3、执行顺序:构造方法--->前方法--->后方法
4、执行的位置:SpringApplication.class run()--->refreshContext()--->refresh()--->AbstractApplicationContext.class refresh()--->finishBeanFactoryInitialization() 执行非懒加载的bean--->ConfigurableListableBeanFactory.class preInstantiateSingletons()