cglib中Enhancer介绍

cglib中Enhancer介绍一、本文内容分类1、接口功能。2、接口运用场景。3、使用案例。4、注意事项。二、接口功能介绍1、Enhancer是一个类的增强器,可以完成对类的代理,在Spring中经常可以看到他的身影比如@Configuration注解的类就会被Enhancer代理。代理时底层用了个字节码处理ASM,ASM是个很牛的东西关于ASM请看我博客里的另一篇文章。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()里面的知识点还是挺多的,感兴趣的可以深入理解下。

 

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

今天的文章cglib中Enhancer介绍分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9346.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注