美文网首页
@Configuration注解为啥要增强

@Configuration注解为啥要增强

作者: 简书徐小耳 | 来源:发表于2018-11-22 18:01 被阅读11次

首先我们增强类的目的一定是因为我们需要额外的功能
增强过程如下

        Enhancer enhancer = new Enhancer();
        设置原始的class为其superclass
        enhancer.setSuperclass(superclass);
        设置其是EnhancedConfiguration类型的,而该接口是BeanFactoryAware
        设置好标识 检测这个class是否已经增强 同时我们在bean初始化的时候
        会通过invokeAwareMethods回调setBeanFactory方法
注意 其最终会检测原始的类(superclass)是否继承了BeanFactoryAware,如果没有 反射的时候不会调用
        enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});
        enhancer.setUseFactory(false);
        命名策略
        enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
        生成proxy的策略,采用我们的classloader替换线程上下文的classloader
        去加载proxy
        enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));
        回调类,proxy调用方法的时候会回调这些
        enhancer.setCallbackFilter(CALLBACK_FILTER);
        回调类的类型
        enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
        return enhancer;
        
        上述回调会最终塞入这几个类
            private static final Callback[] CALLBACKS = new Callback[] {
            检测该类是否有方法包含@Bean,生成bean 
            new BeanMethodInterceptor(),
            实现了上述的BeanFactoryAware的方法,通过反射调用setBeanFactory方法传入beanFactory
如果其原始的类实现了setBeanFactory 则会调用真正的原始类的setBeanFactory 否则只是会给proxy塞入beanFactory
            new BeanFactoryAwareMethodInterceptor(),
            空的实现
            NoOp.INSTANCE
    };

相关文章

网友评论

      本文标题:@Configuration注解为啥要增强

      本文链接:https://www.haomeiwen.com/subject/piqrqqtx.html