1.Spring Bean的生命周期是Spring面试热点问题。Spring Bean的生命周期指的是从一个普通的Java类变成Bean的过程
以下是图例
Spring Bean的生命周期有以下八个步骤:
1)通过XML、Java annotation(注解)以及Java Configuration(配置类)等方式加载Spring Bean
2)BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,会将Bean解析成Spring内部的BeanDefinition结构;
理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构有点类似于XML解析
BeanDefinition
BeanDefiniton是一个接口,继承自AttributeAccessor和BeanMetadataElement两个接口,这两个接口主要是为了“访问对象相关属性”和“获取元数据相关信息”。BeanDefinition的主要定义对象就是Bean,对bean在整个Spring 容器框架中的基本数据结构进行定义,方便BeanFactory等获取
3)BeanDefinition:包含了很多属性和方法。例如:id、class(类名)、scope、ref(依赖的bean)等等。其实就是将bean(例如<bean>)的定义信息
存储到这个对应BeanDefinition相应的属性中
例如:
<bean id="" class="" scope=""> -----> BeanDefinition(id/class/scope)
4)BeanFactoryPostProcessor:是Spring容器功能的扩展接口。
注意:
4.1)BeanFactoryPostProcessor在spring容器加载完BeanDefinition之后,在bean实例化之前执的4.2)对bean元数据(BeanDefinition)进行加工处理,也就是BeanDefinition属性填充、修改等操作
5)BeanFactory:Bean工厂。它按照我们的要求生产我们需要的各种各样的Bean。
例如:
BeanFactory -> List<BeanDefinition>
BeanDefinition(id/class/scope/init-method)
<bean class="com.zking.spring02.biz.BookBizImpl"/>
foreach(BeanDefinition bean : List<BeanDefinition>){undefined
根据class属性反射机制实例化对象(CreateBeanInstance方法)
反射赋值设置属性(PopulateBean方法)
}
6)Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源
例如:BeanNameAware、ApplicationContextAware等等
BeanDefinition 实现了 BeanNameAware、ApplicationContextAware
Spring Aware接口
org.springframework.beans.factory.Aware使得自定义Bean可以识别利用Spring容器的资源,比如:
BeanNameAware.setBeanName(String),可以在Bean中得到它在IOC容器中的Bean的实例的名字
BeanFactoryAware.setBeanFactory(BeanFactory),可以在Bean中得到Bean所在的IOC容器,从而直接在Bean中使用IOC容器的服务
ApplicationContextAware.setApplicationContext(ApplicationContext),可以在Bean中得到Bean所在的应用上下文,从而直接在Bean中使用上下文的服务。
MessageSourceAware,在Bean中可以得到消息源
ApplicationEventPublisherAware,在bean中可以得到应用上下文的事件发布器,从而可以在Bean中发布应用上下文的事件
ResourceLoaderAware,在Bean中可以得到ResourceLoader,从而在bean中使用ResourceLoader加载外部对应的Resource资源
注:Spring官方不推荐自定义Bean实现Aware接口,这会增加代码与Spring 框架的耦合性
7)BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,在显示调用初始化方法的前后添加自定义的逻辑。(类似于AOP的绕环通知)
前提条件:如果检测到Bean对象实现了BeanPostProcessor后置处理器才会执行Before和After方法
BeanPostProcessor
7.1)Before
7.2)调用初始化Bean(InitializingBean和init-method,Bean的初始化才算完成)
7.3)After
完成了Bean的创建工作
8)destory:销毁