@Configuration志宇分析
生活随笔
收集整理的這篇文章主要介紹了
@Configuration志宇分析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
@Configuration 原理
一、執(zhí)行這個(gè)注解的位置ConfigurationClassPostProcessor refresh();invokeBeanFactoryPostProcessors(beanFactory); 在方法中執(zhí)行beanFactoryPostProcess后置處理器invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);執(zhí)行beanFactoryPostProcess后置處理器執(zhí)行ConfigurationClassPostProcessor類的postProcessBeanFactory方法 二、postProcessBeanFactoryenhanceConfigurationClasses(beanFactory);1)循環(huán)遍歷所有的BeanDefinition進(jìn)行如下操作ConfigurationClassUtils.isFullConfigurationClass(beanDef)判斷是否是全注解(這個(gè)類是否有@Configuration注解)如果有這個(gè)注解將beanDef放到Map中 configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef); 2)創(chuàng)建new ConfigurationClassEnhancer類,類中創(chuàng)建了三個(gè)攔截對(duì)象,用于對(duì)創(chuàng)建的增強(qiáng)對(duì)象進(jìn)行攔截new BeanMethodInterceptor(),new BeanFactoryAwareMethodInterceptor(),NoOp.INSTANCE這三個(gè)類都實(shí)現(xiàn)了MethodInterceptor接口3)循環(huán)遍歷所有的configBeanDefs(其中存放的所有的加了@Configuration的類)進(jìn)行如下操作enhancer.enhance(configClass, this.beanClassLoader); 通過(guò)cglib創(chuàng)建代理對(duì)象 三、如何創(chuàng)建代理對(duì)象1)if (EnhancedConfiguration.class.isAssignableFrom(configClass)) return configClass;如果是EnhancedConfiguration.class類型則直接返回(在創(chuàng)建完的代理對(duì)象后,會(huì)給代理對(duì)象設(shè)置成接口為EnhancedConfiguration類型)換句話來(lái)說(shuō)就是如果是這個(gè)類型則代表這個(gè)對(duì)象已經(jīng)增強(qiáng)過(guò)了2)沒(méi)有被代理則 createClass(newEnhancer(configClass, classLoader));其中的newEnhancer(configClass, classLoader)Enhancer enhancer = new Enhancer();enhancer.setSuperclass(superclass); //設(shè)置增強(qiáng)類繼承superclassenhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class}); //設(shè)置代理對(duì)象的實(shí)現(xiàn)接口,便于判斷是否被增強(qiáng)enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);//設(shè)置名字enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));//在代理類中添加一個(gè)屬性1.在BeanFactoryAwareGeneratorStrategy的transform方法中declare_field(Constants.ACC_PUBLIC, BEAN_FACTORY_FIELD, Type.getType(BeanFactory.class), null);添加了一個(gè)公共的 名字為 BEAN_FACTORY_FIELD常量 的 BeanFactory.class(相當(dāng)于在@Configuration所在的類中添加了一個(gè)BeanFactory類型的成員變量,用于調(diào)用getBean獲得對(duì)象)enhancer.setCallbackFilter(CALLBACK_FILTER); (傳入ConfigurationClassEnhancer類中的三個(gè)攔截器)new BeanMethodInterceptor(),new BeanFactoryAwareMethodInterceptor(),NoOp.INSTANCEenhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes()); 四、是如何增強(qiáng)的主要是這三個(gè)過(guò)濾器(這里比較難)攔截方法 intercept(Object enhancedConfigInstance, Method beanMethod, Object[] beanMethodArgs,MethodProxy cglibMethodProxy)攔截的beanMethod是@Configuration 所在類中的方法1)new BeanMethodInterceptor(),isCurrentlyInvokedFactoryMethod(beanMethod) //判斷調(diào)用方法和創(chuàng)建方法是否是同一個(gè)如果是創(chuàng)建對(duì)象如果不是從ioc容器中獲取,如果沒(méi)有則創(chuàng)建2)new BeanFactoryAwareMethodInterceptor(),3)NoOp.INSTANCE五、如果是static則會(huì)失效原因@Configurationpublic class PersionConfig {@Beanpublic static Persion persionBean(){return new com.lizhiyu.studyaspects.Persion();}@Beanpublic Acpects acpectsBean(){persionBean();return new Acpects();} 在ConfigurationClassPostProcessor的 processConfigBeanDefinitions 方法中的this.reader.loadBeanDefinitions(configClasses);loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator);loadBeanDefinitionsForBeanMethod(beanMethod);if (metadata.isStatic()) { //如果是靜態(tài)的 應(yīng)該是設(shè)置成了一個(gè)factorybeanbeanDef.setBeanClassName(configClass.getMetadata().getClassName());beanDef.setFactoryMethodName(methodName);}else {beanDef.setFactoryBeanName(configClass.getBeanName());beanDef.setUniqueFactoryMethodName(methodName);}總結(jié)
以上是生活随笔為你收集整理的@Configuration志宇分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有偿!!!比较急,求基于滑模观测器的开关
- 下一篇: open函数和fopen函数区别