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

2019-10-30 18:01:04 浏览数 (1)

版权声明:本文为博主原创文章,遵循 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("张三");
	}
}

运行结果

0 人点赞