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