bean的初始化过程
Spring Bean的生命周期
一.通过XML、Java annotation(注解)以及Java Configuration(配置类)等方式加载Spring Bean
二.BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,会将Bean解析成Spring 内部的BeanDefinition结构;理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构, 有点类似于XML解析
三. BeanDefinition:包含了很多属性和方法。例如:id、class(类名)、scope、ref(依赖的 bean)等等。其实就是将bean(例如<bean>)的定义信息存储到这个对应BeanDefinition相应 的属性中
例如:<bean id="" class="" scope=""> -----> BeanDefinition(id/class/scope)
四.BeanFactoryPostProcessor:是Spring容器功能的扩展接口。
注意:
1)BeanFactoryPostProcessor在spring容器加载完BeanDefinition之后,在bean实例化之前执行 的
2)对bean元数据(BeanDefinition)进行加工处理,也就是BeanDefinition属性填充、修改等操作
五.BeanFactory:bean工厂。它按照我们的要求生产我们需要的各种各样的bean。
例如:
1.BeanFactory -> List<BeanDefinition>
2.BeanDefinition(id/class/scope/init-method)
3.<bean class="com.zking.spring02.biz.BookBizImpl"/>
4.foreach(BeanDefinition bean : List<BeanDefinition>){
//根据class属性反射机制实例化对象
//反射赋值设置属性
}
六.Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源
例如:BeanNameAware、ApplicationContextAware等等
BeanDefinition 实现了 BeanNameAware、ApplicationContextAware
七.BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,在显示调用初始化 方法的前后添加自定义的逻辑。(类似于AOP的绕环通知)
前提条件:如果检测到Bean对象实现了BeanPostProcessor后置处理器才会执行
Before和After方法
1)Before
2)调用初始化Bean(InitializingBean和init-method,Bean的初始化才算完成)
3)After
完成了Bean的创建工作
八.destory:销毁
Bean的单例与多例模式
一.单例
优点:减少内存的使用,也是Spring中bean默认的创建模式
缺点:会存在变量污染的问题
二.多例
优点:不存在变量污染
缺点:耗内存
三.单例与多例选择
是否会对bean对象中的属性进行修改
会:多例
不会:单例
总结
单例的生命周期:容器生,对象生
多例的生命周期:bean在使用的时候才进行初始化,销毁与容器无关,与Java的垃圾回收机制有 关