CGLib中类Enhancer介绍

Enhancer常用的方法介绍

Enhancer enhancer = new Enhancer();
1、设置要继承的父类
enhancer.setSuperclass(superclass);
2、设置要实现的接口,这里需要实现EnhancedConfiguration,因为EnhancedConfiguration集成了BeanFactoryAware,则要生成对应的实现方法,用于在谁知工厂的时候做增强处理。具体详见ImportAwareBeanPostProcessor。
private static class ImportAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
      private final BeanFactory beanFactory;
      public ImportAwareBeanPostProcessor(BeanFactory beanFactory) {
         this.beanFactory = beanFactory;
      }
      @Override
      public PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) {
         // Inject the BeanFactory before AutowiredAnnotationBeanPostProcessor's
         // postProcessPropertyValues method attempts to autowire other configuration beans.
         if (bean instanceof EnhancedConfiguration) {
            ((EnhancedConfiguration) bean).setBeanFactory(this.beanFactory);
         }
         return pvs;
      }
      @Override
      public Object postProcessBeforeInitialization(Object bean, String beanName)  {
         if (bean instanceof ImportAware) {
            ImportRegistry ir = this.beanFactory.getBean(IMPORT_REGISTRY_BEAN_NAME, ImportRegistry.class);
            AnnotationMetadata importingClass = ir.getImportingClassFor(bean.getClass().getSuperclass().getName());
            if (importingClass != null) {
               ((ImportAware) bean).setImportMetadata(importingClass);
            }
         }
         return bean;
      }
   }
}
enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});

3、设置工厂这个还没用
enhancer.setUseFactory(false);

4、作用:指定生成Bean的名字一种策略 
    public class SpringNamingPolicy extends DefaultNamingPolicy {
       public static final SpringNamingPolicy INSTANCE = new SpringNamingPolicy();
       @Override
       protected String getTag() {
          return "BySpringCGLIB";
       }
    }
例:MathCalculator$$EnhancerBySpringCGLIB$$7e1949802152

enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);

5、设置用于从该生成器创建字节码的策略。默认情况下使用{@see DefaultGeneratorStrategy}的实例。

enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));

6、在CGLib回调时可以设置对不同方法执行不同的回调逻辑,或者根本不执行回调 ,具体用法详见:CGLib中CallbackFilter介绍   链接在文章底部
enhancer.setCallbackFilter(CALLBACK_FILTER);

7、设置拦截器的类型
enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());

8、设置增强器的数组,通过CallbackFilte来指定哪一个方法使用哪一个拦截器,关于Callback的类型具体详见: CGLib中Callback介绍 链接在文章底部
enhancer.setCallbacks(Callback[] callbacks);

参考文章: CGLib中CallbackFilter介绍 和 CGLib中Callback介绍

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值