Spring生命周期中在启动过程中由配置文件转变为系统中能够执行的对象。这个过程中主要步骤有 创建Bean,设置属性。两个关键点将系统中的步骤分为了三个时期中的扩展点。BeanDefintion对象中记录了Bean的基础信息。
一:创建Bean之前,
这个过程是在实例化Class之前,这个时候系统中主要是BeanFactory中信息。对象BeanFactory中还是BeanDefintion。
1.1BeanDefinitionRegistryPostProcessor:
BeanDefintionRegitryPostProcessor是BeanFactory的子类。扩展的方法是:
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
这个方法能够对系统中还未实例化的BeanDefintion进行修改,这个时候BeanDefinitionRegistry中定义的BeanDefinition还没有被处理。
1.2 BeanFactoryPostProcessor:
类的描述是当前类能够修改当前容器中定义的属性,能够对定义的Bean中的属性进行替换,具体的可以看 PropertyResourceConfigurer。这个类是所有的BeanFactory中优先级最高的。主要的功能是对当前系统中的属性配置项进行修改。在BeanFactoryPostProcessor中系统中的Bean还没有实例化,这个过程中不要对Bean进行实例化,否者后期的BeanPostProcessor将会失效。
类中的方法:通过当前的方法能够对当前容器中定义的BeanDefiniton进行处理。
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
1.3 InstantiationAwareBeanPostProcessor:
这个对象是BeanPostProcessor的一个实例。这个类中提供了BeanPostProcessor不同的方法。在框架中对对子类中的方法进行处理,使用的方法是 instanceof 方法来判断子类,然后调用子类的方法。这个类主要在BeanPostProcessor的基础上添加了 在实例化之前处理回调,实例化之后设置属性值之前处理回调。
这个口这个要用来处理特定的目标类,例如创建特定的目标类或者实现特殊的操作。这个接口是提供给框架使用的,建议使用 BeanPostProcessor 接口或者使用 InstantiationAwareBeanPostProcessorAdapter类。
其中这个类有一个关键子类是 SmartInstantiationAwareBeanPostProcessorAdapter,这个类是提供给外部的系统来扩展使用的。
下面看下当前类中的在BeanDefinition转变为Class过程中执行的方法:
Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
这个方法是在Bean被实例化之前进行调用。这个方法返回的Bean会代替系统中的原本生成的Bean。aop就是通过这个方法来实现的。
二:创建Bean之后,设置属性之前
这个过程中Bean对象被创建了出来,但是还没有设置属性。
这个过程可能会经历以下一些扩展点:
2.1 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(Object bean, String beanName);
这个方法表示当前的类已经通过了构造方法或者工厂方法进行实例化。这个是一个很好的将属性注入到bean实例中的回调。其中是典型AutowiredAnnotationBeanPostProcessor的使用实例。
2.2InstantiationAwareBeanPostProcessor.postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
这个方法在设置属性之前可以想所有的属性进行检查,同时对所有的属性进行检查或者替换。返回的结果是处理后的属性值的value。 在Spring框架在 用户对象实例化以后,还未设置属性。在这个过程中能够对当前的顺序进行校验,添加,修改。
三:设置属性之后
这个时间点是对实例中的属性进行赋值,到系统最终指向完毕。这个过程主要是对当前系统中的属性进行扩展。
3.1:Aware属性设置,这个当中主要是将系统中的各种容器属性设置到当前系统中。
3.1.1 BeanNameAware.setBeanName(String name)
Bean对象通过继承BeanNameAware中的setBeanName(String name)方法,将容器中的属性名称设置给当前的Bean。
3.1.2 BeanClassLoaderAware.setBeanClassLoader(ClassLoader classLoader)
Bean定义的Bean,系统中将对应的ClassLoader注入到当前的Bean对象当中。
3.1.3 BeanFactoryAware.setBeanFactory(BeanFactory beanFactory)
通过这个方法,容器将当前容器的BeanFactory注入到Bean对象中。
3.2 BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName);
这个方法是在这个类刚刚赋值完成,返回的结果是一个被Wrapper包装的对象。
3.3 InitializingBean.afterPropertiesSet()
这个方法是当前Bean被实例化以后,调用这个afterProperties()这个方法。
3.4 init-method:这个方法初始化方法。
这个方法中是一个基础的方法。
3.5 BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
这个方法会在实例属性设置完成后调用,返回的结果是一个FacotyBean。同时也能够终止后续的操作。-