在spring中,以AnnotationConfigApplicationContext方式生成类的时候,会用到Configuration注解。在解析完相关注解(类上有Component ComponentScan Import ImportResource ,方法上有bean注解),生成beandifinition后,会对Configuration注解类进行增强。
ConfigurationClassPostProcessor类中enhanceConfigurationClasses
方法中有代码如下图:
先说结论,这个增强使用了cglib,在这个类中增加了一个接口EnhancedConfiguration,这个接口继承了BeanFactoryAware接口,也就是说这个类实现了BeanFactoryAware接口;增加了一个共有字段,名称为beanFactory的值,对Bean注解的方法进行了增强,主要是对factoryBean和循环引用进行处理。也就是说,如果被扫描的类使用了Bean注解且有循环引用,或者有factoryBean,则一定要在类上面加Configuration注解,否则,可以不用加,程序依然顺利通过。
相关代码片段如下:
ConfigurationClassEnhancer类
private Enhancer newEnhancer(Class<?> superclass, ClassLoader classLoader) {
Enhancer enhancer = new Enhancer();
//设置Configuration注解的类为父类
enhancer.setSuperclass(superclass);
//设置EnhancedConfiguration接口
enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});
enhancer.setUseFactory(false);
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
//设置类生成策略,这里使用了asm增加了$$beanFactory字段
enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));
//设置方法增强
enhancer.setCallbackFilter(CALLBACK_FILTER);
enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
return enhancer;
}
感兴趣的话自行跟踪BeanFactoryAwareGeneratorStrategy 以及CALLBACK_FILTER等相关类和变量
另外,对cglib有兴趣可以看cglib中的源码,如下图:
相关文章: