前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring系列(三)——springAOP原理探究(CGLIB代理机制)

spring系列(三)——springAOP原理探究(CGLIB代理机制)

作者头像
逝兮诚
发布2019-10-30 18:01:04
3360
发布2019-10-30 18:01:04
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/77840191

代码语言:javascript
复制
public class PersonProxyFactory {
	public static Person getAuthInstance() {
		Enhancer en = new Enhancer();
		//设置要代理的目标类
		en.setSuperclass(Person.class);
		en.setCallback(new AroundAdvice());
		return (Person)en.create();
	}
}

在默认情况下,如果Spring AOP发现目标实现了相应的Interface,则采用动态代理为其生成代理对象实例;而如果目标对象没有实现任何的Interface,Spring AOP会尝试使用CGLIB动态字节码生成类库,为目标对象生成代理对象实例。这里通过DEMO来演示CGLIB的实现原理。

下面是使用CGLIB做一个 around的例子。

目标Person类。

代码语言:javascript
复制
public class Person {
	public String sayHello(String name) {
		System.out.println("你好," + name);
		return "你好," + name;
	}
}

拦截类AroundAdvice,实现aop的around

代码语言:javascript
复制
public class AroundAdvice implements MethodInterceptor {
	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("执行目标方法之前,模拟开始事务 ..."); 
		Object rvt = proxy.invokeSuper(arg0, args);
		System.out.println("执行目标方法之后,模拟结束事务 ..."); 
		return rvt + " 新增的内容"; 
	}
}

代理工厂PersonProxyFactory类

代码语言:javascript
复制
public class PersonProxyFactory {
	public static Person getAuthInstance() {
		Enhancer en = new Enhancer();
		//设置要代理的目标类
		en.setSuperclass(Person.class);
		en.setCallback(new AroundAdvice());
		return (Person)en.create();
	}
}

测试类

代码语言:javascript
复制
public class PorxyTest {
	public static void main(String[] args) {
		Person person = PersonProxyFactory.getAuthInstance();
		person.sayHello("张三");
	}
}

运行结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档