•Bean 初始化(Initialization)
•@PostConstruct 标注方法
•实现InitializingBean 接口的afterPropertiesSet() 方法
•自定义初始化方法
•XML 配置:<bean init-method=”init” ... />
•Java 注解:@Bean(initMethod=”init”)
•Java API:AbstractBeanDefinition#setInitMethodName(String)
思考:假设以上三种方式均在同一Bean 中定义,那么这些方法的执行顺序是怎样?
•Bean 延迟初始化(Lazy Initialization)
•XML 配置:<bean lazy-init=”true” ... />
•Java 注解:@Lazy(true)
思考:当某个Bean 定义为延迟初始化,那么,Spring 容器返回的对象与非延迟的对象存在怎样的差异?
非延迟初始化在spring应用上下文启动完成后,被初始化;延迟初始化时按需初始化;
finishBeanFactoryInitialization(beanFactory)#beanFactory.preInstantiatSingletons()初始化普通bean,非普通bean中一部分是内部容器自己帮忙初始化了,另一部分是延迟加载按需要初始化;
延迟加载与非延迟加载在bean的注册是没有区别的,按需要注册;在依赖查找和依赖注入的区别就体现在,非延迟查找在上下文启动之前就初始化了,延迟加载在初始化完成之后加载;在spring应用上下文生命周期之前后输出;