前面简单介绍了beanFactory提供的ioc,我们都知道spring使用jdk的动态代理实现了aop,这篇就来看看spring中的aop到底是怎么回事。
前面有提到,在beanFactory中,getBean会走到AbstractAutowireCapableBeanFactory中的doCreateBean,doCreateBean有如下代码段,populateBean主要是xml注入,initializeBean是初始化,产生aop的逻辑就在initializeBean中。
1 //doCreateBean的主要逻辑 2 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) 3 throws BeanCreationException { 4 //使用工厂方法、构造器注入、简单实例化等策略实例化bean(不是策略模式,只是通过bean definition来决定使用哪种策略,类似switch) 5 //BeanWrapper是bean的包装类,beanWrapper提供了便捷的方法去更新bean的字段、访问bean的方法,用于注入 6 BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);//离我们很近 7 final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); 8 //MergedBeanDefinitionPostProcessor的void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) 9 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 10 // Initialize the bean instance. 11 //exposedObject即暴露的bean、原生的bean 12 Object exposedObject = bean; 13 //先执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation, 14 //再执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues,最后再进行xml注入。 15 //所谓populateBean就是根据该bean在xml的配置信息来填充bean,这些信息已经被解析为BeanDefinition。 16 populateBean(beanName, mbd, instanceWrapper); 17 //什么情况下bean==null? 18 if (exposedObject != null) { 19 //初始化bean 20 //invokeAwareMethods(回调BeanNameAware、BeanClassLoaderAware、BeanFactoryAware的相关方法)、 21 //applyBeanPostProcessorsBeforeInitialization(回调BeanPostProcessor的postProcessBeforeInitialization方法)、 22 //invokeInitMethods(回调InitializingBean的afterPropertiesSet,以及init-method)、 23 //applyBeanPostProcessorsAfterInitialization(回调BeanPostProcessor的postProcessAfterInitialization方法) 24 exposedObject = initializeBean(beanName, exposedObject, mbd);//离我们很近 25 } 26 // Register bean as disposable. 27 registerDisposableBeanIfNecessary(beanName, bean, mbd); 28 }