美文网首页
@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