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

来源:互联网 发布:java cova spank bang 编辑:程序博客网 时间:2024/06/07 10:39

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类。

public class Person {public String sayHello(String name) {System.out.println("你好," + name);return "你好," + name;}}

拦截类AroundAdvice,实现aop的around

public class AroundAdvice implements MethodInterceptor {@Overridepublic 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类

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

测试类

public class PorxyTest {public static void main(String[] args) {Person person = PersonProxyFactory.getAuthInstance();person.sayHello("张三");}}

运行结果


阅读全文
0 0
原创粉丝点击