spring源码分析系列 (2) spring拓展接口BeanPostProcessor
Spring更多分析--spring源码分析系列
主要分析内容:
一、BeanPostProcessor简述与demo示例
二、BeanPostProcessor源码分析:注册时机和触发点
(源码基于spring 5.1.3.RELEASE分析)
一、BeanPostProcessor简述与demo示例
BeanPostProcessor是spring非常重要的拓展接口,例如aop通过拓展接口生产代理bean等。接口有两个方法:
/** * Factory hook that allows for custom modification of new bean instances, * e.g. checking for marker interfaces or wrapping them with proxies. * * <p>ApplicationContexts can autodetect BeanPostProcessor beans in their * bean definitions and apply them to any beans subsequently created. * Plain bean factories allow for programmatic registration of post-processors, * applying to all beans created through this factory. * * <p>Typically, post-processors that populate beans via marker interfaces * or the like will implement {@link #postProcessBeforeInitialization}, * while post-processors that wrap beans with proxies will normally * implement {@link #postProcessAfterInitialization}. * * @author Juergen Hoeller * @since 10.10.2003 * @see InstantiationAwareBeanPostProcessor * @see DestructionAwareBeanPostProcessor * @see ConfigurableBeanFactory#addBeanPostProcessor * @see BeanFactoryPostProcessor */ public interface BeanPostProcessor { /** * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. * The returned bean instance may be a wrapper around the original. * <p>The default implementation returns the given {@code bean} as-is. * @param bean the new bean instance * @param beanName the name of the bean * @return the bean instance to use, either the original or a wrapped one; * if {@code null}, no subsequent BeanPostProcessors will be invoked * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet */ @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. * The returned bean instance may be a wrapper around the original. * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean * instance and the objects created by the FactoryBean (as of Spring 2.0). The * post-processor can decide whether to apply to either the FactoryBean or created * objects or both through corresponding {@code bean instanceof FactoryBean} checks. * <p>This callback will also be invoked after a short-circuiting triggered by a * {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation} method, * in contrast to all other BeanPostProcessor callbacks. * <p>The default implementation returns the given {@code bean} as-is. * @param bean the new bean instance * @param beanName the name of the bean * @return the bean instance to use, either the original or a wrapped one; * if {@code null}, no subsequent BeanPostProcessors will be invoked * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet * @see org.springframework.beans.factory.FactoryBean */ @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }
以上为spring原始接口,这里说明一下:
- ApplicationContext类型的容器会自动发现和注册该类型的bean,通过BeanPostProcessor可以对bean进行定制化,接口作用域是所有bean创建。
- postProcessBeforeInitialization触发时机在bean实例化(Instantiation)之后,所有初始化(Initialization)动作(包括 InitializingBean#afterPrpertiesSet() 和 定制化init-method())以前。
- postProcessAfterInitialization触发时机在bean实例化(Instantiation)之后,所有初始化(Initialization)动作(包括 InitializingBean#afterPrpertiesSet() 和 定制化init-method())以后。同时还会在InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation 和 FactoryBean(bean工厂)获得bean时候调用。这个也是重要的点,放在往后的博客中阐述。
由于ApplicationContext可以自动发现并注册BeanPostProcessor,如下使用ApplicationContext类型容器实现一个简单demo。 对应的demo代码可参考: https://gitee.com/zhouxiaoxing91/learning-src/tree/master
1 public class BeanPostProcessorTest { 2 3 private ApplicationContext applicationContext ; 4 5 @Before 6 public void beforeApplicationContext(){ 7 /** 8 * ApplicationContext 自动注册 BeanPostProcessor 9 * 不需要手动注册 10 * */ 11 applicationContext = new ClassPathXmlApplicationContext("ioc-beanPostProcessor.xml") ; 12 } 13 14 @Test 15 public void test(){ 16 Bean bean = applicationContext.getBean("bean", Bean.class) ; 17 System.out.println(bean); 18 } 19 20 @After 21 public void after(){ 22 ((ClassPathXmlApplicationContext)applicationContext).close(); 23 } 24 }
1 public class Bean { 2 3 public Bean(){ 4 5 } 6 7 public Bean(String name){ 8 System.out.println("构造函数被调用啦"); 9 this.name = name ; 10 } 11 12 private String name ; 13 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 @Override 24 public String toString() { 25 return "Bean{" + 26 "name='" + name + '\'' + 27 '}'; 28 } 29 }
1 public class LogicBeanPostProcessor implements BeanPostProcessor { 2 3 @Nullable 4 @Override 5 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 6 System.out.println("LogicBeanPostProcessor.postProcessAfterInitialization 执行啦 beanName = " + beanName); 7 return bean; 8 } 9 10 @Nullable 11 @Override 12 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 13 System.out.println("LogicBeanPostProcessor.postProcessBeforeInitialization 执行啦 beanName = " + beanName); 14 return bean; 15 } 16 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 5 6 <bean id="bean" class="com.nancy.ioc.Bean"> 7 <constructor-arg name="name" value="zhouxiaoxing"/> 8 </bean> 9 10 <bean id="logicBeanPostProcessor" class="com.nancy.ioc.BeanPostProcessor.LogicBeanPostProcessor"/> 11 </beans>
运行结果符合以上的结论:
构造函数被调用啦
LogicBeanPostProcessor.postProcessBeforeInitialization 执行啦 beanName = bean
LogicBeanPostProcessor.postProcessAfterInitialization 执行啦 beanName = bean
Bean{name='zhouxiaoxing'}
提出两个疑问:
1、在ApplicationContext容器中何时注册BeanPostProcessor接口 ?
二、BeanPostProcessor源码分析:注册时机和触发点
在AbstractApplicationContext容器启动的refresh()会注册BeanPostProcessor,源码如下:
1 @Override 2 public void refresh() throws BeansException, IllegalStateException { 3 synchronized (this.startupShutdownMonitor) { 4 // Prepare this context for refreshing. 5 prepareRefresh(); 6 7 // Tell the subclass to refresh the internal bean factory. 8 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 9 10 // Prepare the bean factory for use in this context. 11 prepareBeanFactory(beanFactory); 12 13 try { 14 // Allows post-processing of the bean factory in context subclasses. 15 postProcessBeanFactory(beanFactory); 16 17 // Invoke factory processors registered as beans in the context. 18 invokeBeanFactoryPostProcessors(beanFactory); 19 20 // Register bean processors that intercept bean creation. 21 // 注册BeanPostProcessor 在bean创建的时候进行拦截 22 registerBeanPostProcessors(beanFactory); 23 24 // Initialize message source for this context. 25 initMessageSource(); 26 27 // Initialize event multicaster for this context. 28 initApplicationEventMulticaster(); 29 30 // Initialize other special beans in specific context subclasses. 31 onRefresh(); 32 33 // Check for listener beans and register them. 34 registerListeners(); 35 36 // Instantiate all remaining (non-lazy-init) singletons. 37 finishBeanFactoryInitialization(beanFactory); 38 39 // Last step: publish corresponding event. 40 finishRefresh(); 41 } 42 43 catch (BeansException ex) { 44 if (logger.isWarnEnabled()) { 45 logger.warn("Exception encountered during context initialization - " + 46 "cancelling refresh attempt: " + ex); 47 } 48 49 // Destroy already created singletons to avoid dangling resources. 50 destroyBeans(); 51 52 // Reset 'active' flag. 53 cancelRefresh(ex); 54 55 // Propagate exception to caller. 56 throw ex; 57 } 58 59 finally { 60 // Reset common introspection caches in Spring's core, since we 61 // might not ever need metadata for singleton beans anymore... 62 resetCommonCaches(); 63 } 64 } 65 } 66 67 ...... 68 69 /** 70 * Instantiate and invoke all registered BeanPostProcessor beans, 71 * respecting explicit order if given. 72 * <p>Must be called before any instantiation of application beans. 73 */ 74 protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { 75 PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); 76 }
跟进PostProcessorRegistrationDelegate.registerBeanPostProcessors
1 public static void registerBeanPostProcessors( 2 ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { 3 4 /** 5 * 此时bean的定义加载已经完成,但是还没有实例化。 获得所有BeanPostProcessor bean对应的beanName 6 */ 7 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); 8 9 /** 10 * 注册日志BeanPostProcessor, 检测注册的bean是否为spring基础服务类并打印日志 11 */ 12 // Register BeanPostProcessorChecker that logs an info message when 13 // a bean is created during BeanPostProcessor instantiation, i.e. when 14 // a bean is not eligible for getting processed by all BeanPostProcessors. 15 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; 16 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); 17 18 /** 19 * 当有注册多个BeanPostProcessor接口时会按顺序进行,即 实现PriorityOrdered->实现Ordered->普通类型接口->内部系统MergedBeanDefinitionPostProcessor 20 */ 21 // Separate between BeanPostProcessors that implement PriorityOrdered, 22 // Ordered, and the rest. 23 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); 24 List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); 25 List<String> orderedPostProcessorNames = new ArrayList<>(); 26 List<String> nonOrderedPostProcessorNames = new ArrayList<>(); 27 for (String ppName : postProcessorNames) { 28 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { 29 30 /** 31 * 通过beanFactory.getBean(), 将会提前初始化BeanPostProcessor类型实例 32 */ 33 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 34 priorityOrderedPostProcessors.add(pp); 35 if (pp instanceof MergedBeanDefinitionPostProcessor) { 36 internalPostProcessors.add(pp); 37 } 38 } 39 else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { 40 orderedPostProcessorNames.add(ppName); 41 } 42 else { 43 nonOrderedPostProcessorNames.add(ppName); 44 } 45 } 46 47 // First, register the BeanPostProcessors that implement PriorityOrdered. 48 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); 49 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); 50 51 // Next, register the BeanPostProcessors that implement Ordered. 52 List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); 53 for (String ppName : orderedPostProcessorNames) { 54 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 55 orderedPostProcessors.add(pp); 56 if (pp instanceof MergedBeanDefinitionPostProcessor) { 57 internalPostProcessors.add(pp); 58 } 59 } 60 sortPostProcessors(orderedPostProcessors, beanFactory); 61 registerBeanPostProcessors(beanFactory, orderedPostProcessors); 62 63 // Now, register all regular BeanPostProcessors. 64 List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); 65 for (String ppName : nonOrderedPostProcessorNames) { 66 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 67 nonOrderedPostProcessors.add(pp); 68 if (pp instanceof MergedBeanDefinitionPostProcessor) { 69 internalPostProcessors.add(pp); 70 } 71 } 72 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); 73 74 // Finally, re-register all internal BeanPostProcessors. 75 sortPostProcessors(internalPostProcessors, beanFactory); 76 registerBeanPostProcessors(beanFactory, internalPostProcessors); 77 78 /** 79 * ApplicationListener探测器,当bean实现ApplicationListener接口时自动注册监听 80 */ 81 // Re-register post-processor for detecting inner beans as ApplicationListeners, 82 // moving it to the end of the processor chain (for picking up proxies etc). 83 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); 84 } 85 86 /** 87 * 按照给定Ordered的顺序排序 88 */ 89 private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) { 90 Comparator<Object> comparatorToUse = null; 91 if (beanFactory instanceof DefaultListableBeanFactory) { 92 comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator(); 93 } 94 if (comparatorToUse == null) { 95 comparatorToUse = OrderComparator.INSTANCE; 96 } 97 postProcessors.sort(comparatorToUse); 98 } 99 100 /** 101 * Register the given BeanPostProcessor beans. 102 */ 103 private static void registerBeanPostProcessors( 104 ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) { 105 106 for (BeanPostProcessor postProcessor : postProcessors) { 107 beanFactory.addBeanPostProcessor(postProcessor); 108 } 109 }
跟进AbstractBeanFactory#addBeanPostProcessor
1 /** BeanPostProcessors to apply in createBean. */ 2 private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>(); 3 4 /** Indicates whether any InstantiationAwareBeanPostProcessors have been registered. */ 5 private volatile boolean hasInstantiationAwareBeanPostProcessors; 6 7 /** Indicates whether any DestructionAwareBeanPostProcessors have been registered. */ 8 private volatile boolean hasDestructionAwareBeanPostProcessors; 9 10 11 /** 12 * 所有的BeanPostProcessor接口实例保存于CopyOnWriteArrayList中 13 * 1、一个实例只注册一次 14 * 2、通过hasInstantiationAwareBeanPostProcessors设置,判定是否存在InstantiationAwareBeanPostProcessor接口实例,为后续执行做判断 15 * 3、通过hasDestructionAwareBeanPostProcessors设置,判定是否存在DestructionAwareBeanPostProcessor接口实例,为后续执行做判断 16 */ 17 @Override 18 public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { 19 Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); 20 // Remove from old position, if any 21 this.beanPostProcessors.remove(beanPostProcessor); 22 // Track whether it is instantiation/destruction aware 23 if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) { 24 this.hasInstantiationAwareBeanPostProcessors = true; 25 } 26 if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) { 27 this.hasDestructionAwareBeanPostProcessors = true; 28 } 29 // Add to end of list 30 this.beanPostProcessors.add(beanPostProcessor); 31 }
修改上述demo中LogicBeanPostProcessor.java文件,并debug模式查看:
1 public class LogicBeanPostProcessor implements BeanPostProcessor { 2 3 public LogicBeanPostProcessor(){ 4 System.out.println("LogicBeanPostProcessor 被 beanFactory.getBean() 提前初始化"); 5 } 6 7 @Nullable 8 @Override 9 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 10 System.out.println("LogicBeanPostProcessor.postProcessAfterInitialization 执行啦 beanName = " + beanName); 11 return bean; 12 } 13 14 @Nullable 15 @Override 16 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 17 System.out.println("LogicBeanPostProcessor.postProcessBeforeInitialization 执行啦 beanName = " + beanName); 18 return bean; 19 } 20 }
查看PostProcessorRegistrationDelegate#registerBeanPostProcessors,注册一个普通BeanPostProcessor -> logicBeanPostProcessor
最后运行结果:
LogicBeanPostProcessor 被 beanFactory.getBean() 提前初始化 构造函数被调用啦 LogicBeanPostProcessor.postProcessBeforeInitialization 执行啦 beanName = bean LogicBeanPostProcessor.postProcessAfterInitialization 执行啦 beanName = bean Bean{name='zhouxiaoxing'}
总结如下:
(1)、BeanPostProcessor注册的入口在AbstractApplicationContext容器启动的refresh()的AbstractApplicationContext#registerBeanPostProcessors。
(2)、AbstractApplicationContext进而委派PostProcessorRegistrationDelegate#registerBeanPostProcessors实现注册。
(3)、当有注册多个BeanPostProcessor接口时会按顺序进行,即 实现PriorityOrdered->实现Ordered->普通类型接口->内部系统MergedBeanDefinitionPostProcessor。而同种类型也会进行排序,按顺序注册。
(4)、BeanPostProcessor类型实例会通过BeanFactory#getBean()提前初始化。
触发BeanPostProcessor有很多入口,首先分析几个入口后续的再补上。
触发(1)AbstractAutowireCapableBeanFactory#createBean 中:
1 /** 2 * Central method of this class: creates a bean instance, 3 * populates the bean instance, applies post-processors, etc. 4 * @see #doCreateBean 5 */ 6 @Override 7 protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) 8 throws BeanCreationException { 9 10 if (logger.isTraceEnabled()) { 11 logger.trace("Creating instance of bean '" + beanName + "'"); 12 } 13 RootBeanDefinition mbdToUse = mbd; 14 15 // Make sure bean class is actually resolved at this point, and 16 // clone the bean definition in case of a dynamically resolved Class 17 // which cannot be stored in the shared merged bean definition. 18 Class<?> resolvedClass = resolveBeanClass(mbd, beanName); 19 if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) { 20 mbdToUse = new RootBeanDefinition(mbd); 21 mbdToUse.setBeanClass(resolvedClass); 22 } 23 24 // Prepare method overrides. 25 try { 26 mbdToUse.prepareMethodOverrides(); 27 } 28 catch (BeanDefinitionValidationException ex) { 29 throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), 30 beanName, "Validation of method overrides failed", ex); 31 } 32 33 try { 34 // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. 35 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 36 if (bean != null) { 37 return bean; 38 } 39 } 40 catch (Throwable ex) { 41 throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, 42 "BeanPostProcessor before instantiation of bean failed", ex); 43 } 44 45 try { 46 // bean 创建 47 Object beanInstance = doCreateBean(beanName, mbdToUse, args); 48 if (logger.isTraceEnabled()) { 49 logger.trace("Finished creating instance of bean '" + beanName + "'"); 50 } 51 return beanInstance; 52 } 53 catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) { 54 // A previously detected exception with proper bean creation context already, 55 // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry. 56 throw ex; 57 } 58 catch (Throwable ex) { 59 throw new BeanCreationException( 60 mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex); 61 } 62 } 63 64 /** 65 * Actually create the specified bean. Pre-creation processing has already happened 66 * at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks. 67 * <p>Differentiates between default bean instantiation, use of a 68 * factory method, and autowiring a constructor. 69 * @param beanName the name of the bean 70 * @param mbd the merged bean definition for the bean 71 * @param args explicit arguments to use for constructor or factory method invocation 72 * @return a new instance of the bean 73 * @throws BeanCreationException if the bean could not be created 74 * @see #instantiateBean 75 * @see #instantiateUsingFactoryMethod 76 * @see #autowireConstructor 77 */ 78 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) 79 throws BeanCreationException { 80 81 // Instantiate the bean. 82 BeanWrapper instanceWrapper = null; 83 if (mbd.isSingleton()) { 84 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); 85 } 86 if (instanceWrapper == null) { 87 instanceWrapper = createBeanInstance(beanName, mbd, args); 88 } 89 90 // 省略...... 91 92 // Initialize the bean instance. 93 Object exposedObject = bean; 94 try { 95 // 根据加载到的bean definition给 bean赋值 96 populateBean(beanName, mbd, instanceWrapper); 97 // 调用bean初始化方法 98 exposedObject = initializeBean(beanName, exposedObject, mbd); 99 } 100 catch (Throwable ex) { 101 if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { 102 throw (BeanCreationException) ex; 103 } 104 else { 105 throw new BeanCreationException( 106 mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); 107 } 108 } 109 110 // 省略...... 111 112 return exposedObject; 113 }
跟进AbstractAutowireCapableBeanFactory#initializeBean方法:
1 /** 2 * Initialize the given bean instance, applying factory callbacks 3 * as well as init methods and bean post processors. 4 * <p>Called from {@link #createBean} for traditionally defined beans, 5 * and from {@link #initializeBean} for existing bean instances. 6 * @param beanName the bean name in the factory (for debugging purposes) 7 * @param bean the new bean instance we may need to initialize 8 * @param mbd the bean definition that the bean was created with 9 * (can also be {@code null}, if given an existing bean instance) 10 * @return the initialized bean instance (potentially wrapped) 11 * @see BeanNameAware 12 * @see BeanClassLoaderAware 13 * @see BeanFactoryAware 14 * @see #applyBeanPostProcessorsBeforeInitialization 15 * @see #invokeInitMethods 16 * @see #applyBeanPostProcessorsAfterInitialization 17 */ 18 protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { 19 // 1、工厂factory类 接口回调 20 if (System.getSecurityManager() != null) { 21 AccessController.doPrivileged((PrivilegedAction<Object>) () -> { 22 invokeAwareMethods(beanName, bean); 23 return null; 24 }, getAccessControlContext()); 25 } 26 else { 27 invokeAwareMethods(beanName, bean); 28 } 29 30 Object wrappedBean = bean; 31 if (mbd == null || !mbd.isSynthetic()) { 32 // 2、BeanPostProcessor前置执行 33 wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 34 } 35 36 try { 37 // 3、InitializingBean接口方法 or 自定义 init method 执行 38 invokeInitMethods(beanName, wrappedBean, mbd); 39 } 40 catch (Throwable ex) { 41 throw new BeanCreationException( 42 (mbd != null ? mbd.getResourceDescription() : null), 43 beanName, "Invocation of init method failed", ex); 44 } 45 if (mbd == null || !mbd.isSynthetic()) { 46 // 4、BeanPostProcessor后置执行 47 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); 48 } 49 50 return wrappedBean; 51 }
对应回调方法:
1 private void invokeAwareMethods(final String beanName, final Object bean) { 2 if (bean instanceof Aware) { 3 if (bean instanceof BeanNameAware) { 4 ((BeanNameAware) bean).setBeanName(beanName); 5 } 6 if (bean instanceof BeanClassLoaderAware) { 7 ClassLoader bcl = getBeanClassLoader(); 8 if (bcl != null) { 9 ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl); 10 } 11 } 12 if (bean instanceof BeanFactoryAware) { 13 ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); 14 } 15 } 16 } 17 18 /** 19 * Give a bean a chance to react now all its properties are set, 20 * and a chance to know about its owning bean factory (this object). 21 * This means checking whether the bean implements InitializingBean or defines 22 * a custom init method, and invoking the necessary callback(s) if it does. 23 * @param beanName the bean name in the factory (for debugging purposes) 24 * @param bean the new bean instance we may need to initialize 25 * @param mbd the merged bean definition that the bean was created with 26 * (can also be {@code null}, if given an existing bean instance) 27 * @throws Throwable if thrown by init methods or by the invocation process 28 * @see #invokeCustomInitMethod 29 */ 30 protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) 31 throws Throwable { 32 33 boolean isInitializingBean = (bean instanceof InitializingBean); 34 if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { 35 if (logger.isTraceEnabled()) { 36 logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'"); 37 } 38 if (System.getSecurityManager() != null) { 39 try { 40 AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> { 41 ((InitializingBean) bean).afterPropertiesSet(); 42 return null; 43 }, getAccessControlContext()); 44 } 45 catch (PrivilegedActionException pae) { 46 throw pae.getException(); 47 } 48 } 49 else { 50 ((InitializingBean) bean).afterPropertiesSet(); 51 } 52 } 53 54 if (mbd != null && bean.getClass() != NullBean.class) { 55 String initMethodName = mbd.getInitMethodName(); 56 if (StringUtils.hasLength(initMethodName) && 57 !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && 58 !mbd.isExternallyManagedInitMethod(initMethodName)) { 59 invokeCustomInitMethod(beanName, bean, mbd); 60 } 61 } 62 } 63 64 @Override 65 public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) 66 throws BeansException { 67 68 Object result = existingBean; 69 for (BeanPostProcessor processor : getBeanPostProcessors()) { 70 Object current = processor.postProcessBeforeInitialization(result, beanName); 71 if (current == null) { 72 return result; 73 } 74 result = current; 75 } 76 return result; 77 } 78 79 @Override 80 public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) 81 throws BeansException { 82 83 Object result = existingBean; 84 for (BeanPostProcessor processor : getBeanPostProcessors()) { 85 Object current = processor.postProcessAfterInitialization(result, beanName); 86 if (current == null) { 87 return result; 88 } 89 result = current; 90 } 91 return result; 92 }
总结如下:
(1.1)、由此可见BeanPostProcessor的一个触发入口在AbstractAutowireCapableBeanFactory#createBean,最终至AbstractAutowireCapableBeanFactory#initializeBean。
(1.2)、AbstractAutowireCapableBeanFactory#initializeBean不但会触发BeanPostProcessor回掉方法,并且还会按顺序执行bean生命周期:
- factory类型接口(BeanNameAware#setBeanName)
- factory类型接口(BeanClassLoaderAware#setBeanClassLoader)
- factory类型接口(BeanFactoryAware#setBeanFactory)
- BeanPostProcessor#postProcessBeforeInitialization
- InitializingBean和自定义的init-method
- BeanPostProcessor#postProcessAfterInitialization
触发(2)FactoryBeanRegistrySupport(后续补上)