锦屏县城乡和建设局网站,图片制作动图,网站开发还是安卓开发好,设计公司的企业远景在bean的初始化阶段#xff0c;bean已经被实例化及属性填充了#xff0c;此时的bean已相对成熟#xff0c;接下来的初始化阶段还会做一些额外的工作对bean做进一步处理#xff0c;主要包括以下四个方面#xff1a; 调用aware接口方法 初始化前#xff1a;调用初始化前的… 在bean的初始化阶段bean已经被实例化及属性填充了此时的bean已相对成熟接下来的初始化阶段还会做一些额外的工作对bean做进一步处理主要包括以下四个方面 调用aware接口方法 初始化前调用初始化前的后置处理器方法 初始化调用InitializingBean接口的afterPropertiesSet方法 初始化后调用初始化后的后置处理器方法
1. Bean初始化主流程 AbstractAutowireCapableBeanFactory#initializeBean 运用aware回调接口、afterPropertiesSet方法、后置处理器完成bean实例的初始化
// 运用aware回调接口、afterPropertiesSet方法、后置处理器完成bean实例的初始化
protected Object initializeBean(final String beanName, final Object bean, Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() ! null) {AccessController.doPrivileged((PrivilegedActionObject) () - {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {// 1.调用aware接口的方法invokeAwareMethods(beanName, bean);}Object wrappedBean bean;if (mbd null || !mbd.isSynthetic()) {// 2.调用初始化前后置处理器wrappedBean applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {// 3.调用初始化方法其实就是afterPropertiesSet方法invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd ! null ? mbd.getResourceDescription() : null),beanName, Invocation of init method failed, ex);}if (mbd null || !mbd.isSynthetic()) {// 4.调用初始化后后置处理器wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}
2. Aware接口调用 如果Bean实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口则会调用相应接口的方法。
BeanNameAware在Bean实例化后进行扩展操作可以获取Bean的名称BeanClassLoaderAware在Bean实例化后进行扩展操作可以获取Bean的类加载器BeanFactoryAware在Bean实例化后进行扩展操作可以获取Bean所属的BeanFactory
private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl getBeanClassLoader();if (bcl ! null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}
3. 初始化前调用初始化前的后置处理器方法 这里涉及到了Bean后置处理器BeanPostProcessor其作用如下 spring会自动从它的所有的bean定义中检测BeanPostProcessor类型的bean定义然后实例化它们再将它们应用于随后创建的每一个bean实例 在bean实例的初始化方法回调之前调用BeanPostProcessor的postProcessBeforeInitialization的方法 在bean实例的初始化方法回调之后调用BeanPostProcessor的postProcessAfterInitialization的方法 通常通过标记接口等方式填充bean的后置处理器会实现postProcessBeforeInitialization方法而将bean包装为代理的后置处理器会实现postProcessAfterInitialization方法
public interface BeanPostProcessor {Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}Nullabledefault Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}
}
Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current processor.postProcessBeforeInitialization(result, beanName);if (current null) {return result;}result current;}return result;
} 例如ApplicationContextAwareProcessor后置处理器其重写了postProcessBeforeInitialization方法如果bean实现了EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口则会调用响应接口的方法
EnvironmentAware在Bean实例化后进行扩展操作可以获取Environment实例EmbeddedValueResolverAware在Bean实例化后进行扩展操作可以获取StringValueResolver实例可用于解析占位符ResourceLoaderAware在Bean实例化后进行扩展操作可以获取ResourceLoader实例ApplicationEventPublisherAware在Bean实例化后进行扩展操作可以获取ApplicationEventPublisher实例MessageSourceAware在Bean实例化后进行扩展操作可以获取MessageSource实例ApplicationContextAware在Bean实例化后进行扩展操作可以获取ApplicationContext实例
4. 初始化调用InitializingBean接口的afterPropertiesSet方法或自定义的init方法
protected void invokeInitMethods(String beanName, final Object bean, Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean (bean instanceof InitializingBean);if (isInitializingBean (mbd null || !mbd.isExternallyManagedInitMethod(afterPropertiesSet))) {if (logger.isTraceEnabled()) {logger.trace(Invoking afterPropertiesSet() on bean with name beanName );}if (System.getSecurityManager() ! null) {try {AccessController.doPrivileged((PrivilegedExceptionActionObject) () - {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {// 调用afterPropertiesSet方法((InitializingBean) bean).afterPropertiesSet();}}if (mbd ! null bean.getClass() ! NullBean.class) {String initMethodName mbd.getInitMethodName();if (StringUtils.hasLength(initMethodName) !(isInitializingBean afterPropertiesSet.equals(initMethodName)) !mbd.isExternallyManagedInitMethod(initMethodName)) {// 调用自定义的init方法invokeCustomInitMethod(beanName, bean, mbd);}}
}
5. 初始化后调用初始化后的后置处理器方法
Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current processor.postProcessAfterInitialization(result, beanName);if (current null) {return result;}result current;}return result;
}