首先我们增强类的目的一定是因为我们需要额外的功能
增强过程如下
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
};
网友评论