一、本文内容分类
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()里面的知识点还是挺多的,感兴趣的可以深入理解下。
有问题的地方也麻烦大家在下面留言,我在进一步完善下哈。
今天的文章cglib中Enhancer介绍分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9346.html