Spring IOC(7) CGLib

@Bean可以控制对象的产生过程;
如果是@Component给了spring那么spring直接就自己就实例化了;


@Configuration
@ComponentScan(“sum”)
public class JavaConfig {
@Bean
public E e(){
System.out.println(“E方法”);
return new E();
}
@Bean
public F f(){
e();
System.out.println(“F方法”);
return new F();
}
}


public class E {
}


public class F {
}


AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(JavaConfig.class);


在执行这个applicationContext后会打印一次“E方法”
当不加@Configuration注解的时候就会打印两次“E方法”
也就是说@Configuration启用代理保证实例是单例的bean;

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());方法的中的
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);方法;
子类:BeanDefinitionRegistryPostProcessor
父类:BeanFactoryPostProcessors
该方法执行时机:同时实现子类,父类的方法也就是实现子类的BeanDefinition,其父类方法在这个方法里面实现,包括三种;
该方法执行ConfigurationClassPostProcessor种的postProcessBeanFactory;
其中重要方法
enhanceConfigurationClasses(beanFactory);
在这个方法中我们获取所有的bean的name去遍历,并且判断是否为抽象类或者加了full属性的类;如果是不是抽象类而且是full类那么才会执行代理逻辑;而且只有加了注解@Configuration他才会被spring标记上full属性;否则就是little属性;


if (ConfigurationClassUtils.CONFIGURATION_CLASS_FULL.equals(configClassAttr)) {
//判断是否为full
if (!(beanDef instanceof AbstractBeanDefinition)) {
throw new BeanDefinitionStoreException(“Cannot enhance @Configuration bean definition '” +
beanName + “’ since it is not stored in an AbstractBeanDefinition subclass”);
}
else if (logger.isInfoEnabled() && beanFactory.containsSingleton(beanName)) {
logger.info(“Cannot enhance @Configuration bean definition '” + beanName +
"’ since its singleton instance has been created too early. The typical cause " +
"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
“return type: Consider declaring such methods as ‘static’.”);
}
configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);
}
}
//如果为空,那么就代表根本没有适合规则的类直接返回,代表有全配置类
if (configBeanDefs.isEmpty()) {
// nothing to enhance -> return immediately
return;
}


然后遍历拿到
Class<?> configClass = beanDef.getBeanClass();
//得到原类的class类,不管是什么代理都要先获取class类
Class<?> enhancedClass = enhancer.enhance(configClass, this.beanClassLoader);
//产生代理对象,所有代理对象都不是修改原有对象,都是生成新的对象,cglib就是继承对象
Class<?> enhancedClass = createClass(newEnhancer(configClass, classLoader));
//执行该方法获得代理对象
private Enhancer newEnhancer(Class<?> configSuperClass, @Nullable ClassLoader classLoader) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(configSuperClass);
//继承父类
enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});
//设置证明这个是cglib类的接口
enhancer.setUseFactory(false);
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
//设置名字的生成策略,生成cglib类的名字
enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));
enhancer.setCallbackFilter(CALLBACK_FILTER);
//
enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
return enhancer;
}
模拟cglib代理类
目标对象
public class E {
public void cglibMtd(){
System.out.println(“目标对象”);
}
}
代理类
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(“before”);
Object returnO=methodProxy.invokeSuper(o,null);
System.out.println(“after”);
return returnO;
}
}
测试
public static void main(String[] args) {
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(E.class);
enhancer.setCallback(new MyMethodInterceptor());
enhancer.setUseFactory(false);
enhancer.setCallbackType(MyMethodInterceptor.class);
E e=(E)enhancer.create();
e.cglibMtd();
}
打印结果:before 目标对象 after


@Bean的时候beanclass和beanname都是空的,@Component的beanclass和beanname都是有值的;
每一个BeanDefinition都有其特点;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值