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 {
@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类
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("张三");
}
}
运行结果