cglib中Enhancer介绍

一、本文内容分类

1、接口功能。

2、接口运用场景。

3、使用案例。

4、注意事项。

二、接口功能介绍

1、Enhancer是一个类的增强器,可以完成对类的代理,在Spring中经常可以看到他的身影比如@Configuration注解的类就会被Enhancer代理。代理时底层用了个字节码处理ASM,ASM是个很牛的东西关于ASM请看我博客里的另一篇文章。Enhancer的源码比较多,我这里就简单地贴一些。

因为Enhancer目的就是为了完成代理,所有我们称之为代理类,被代理的类我们称目标类。

private Class[] interfaces;//存的是代理类实现的所有接口。
private CallbackFilter filter; 
private Callback[] callbacks; //回调函数,这个很厉害。
private Class superclass;//该代理的父类,也就是目标类

2、上面属性中有个callbacks字段,类型是Callback,回想下我们在开发中用过Callback的哪些子类,大名鼎鼎的MethodInterceptor不知道大家还有没有印象,这个类可以拦截我们的目标方法。想象下这个类多么恐怖,不仅能代理你的类,还能拦截你的方法,Spring Aop就是这样实现的。下面Enhancer类结合MethodInterceptor写个简单的Demo。

三、接口运用场景

四、使用案例。

1、有个目标类A,通过Enhancer来完成代理,往Enhancer里面添加拦截器,拦截A的方法,拦截后再调用目标类的方法。

2、目标类IndexDao

public class IndexDao {
    //添加一个查询方法。
	public void query(){
		System.out.println("indexDao-query");
		return ;
	}

}

2、拦截器类MyMethodInterceptor

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyMethodInterceptor implements MethodInterceptor {
	@Override
	public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
		//o表示目标类,method目标类的方法,objects目标类方法需要的形参,methodProxy表示代理类+目标方法。
		System.out.println("拦截("+method.getName()+")方法");
		//执行目标类的方法。
		return methodProxy.invokeSuper(o,objects);
	}
}

3、Enhancer类

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppTest {
    public static void main(String[] args) {
		// 先创建一个代理对象
		Enhancer enhancer = new Enhancer();
		// 要代理的对象的class
		enhancer.setSuperclass(IndexDao.class);
		// 设置代理的回调,Callback的实现类
		enhancer.setCallback(new MyMethodInterceptor());
		//创建代理对象
		IndexDao indexDao = (IndexDao) enhancer.create();
		indexDao.query();
    }
}

4、打印结果

拦截(query)方法
indexDao-query

5、结果分析

在执行query()时,先执行了intercept方法,就好比在执更新操作前申明事务,在执行methodProxy.invokeSuper(o,objects)方法如果报错,我们就可以在这行代码后面添加回滚代码。

五、注意事项

1、MethodInterceptor拦截的是该类下手动添加的方法,像一些toString,hasCode这种,如果没有重写是不会拦截的。

2、enhancer.create()里面的知识点还是挺多的,感兴趣的可以深入理解下。

 

有问题的地方也麻烦大家在下面留言,我在进一步完善下哈。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值