ProxyFactory: 拦截没有接口的类
//如果没有接口, 只能用CGLIB, 无论是否声明
pf.setProxyTargetClass(true);
结果
总结
如果满足以下列出的三种情况中的任何一种,ProxyFactory将对目标类进行基于类的代理。
如果目标类没有实现任何接口,不管proxyTargetClass的值是什么,ProxyFactory会采用基于类的代理。
如果有接口并且ProxyFactory的proxyTargetClass属性值被设置为true,ProxyFactory会采用基于类的代理。
如果有接口并且ProxyFactory的optimize属性值被设置为true,ProxyFactory会采用基于类的代理。
public class TaskImpl {
public void execute() {
System.out.println("run code to here");
}
}
//如果没有接口, 只能用CGLIB, 无论是否声明
pf.setProxyTargetClass(true);
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
public class test2 {
public static void main(String[] args) {
TaskImpl target =new TaskImpl();
ProxyFactory pf=new ProxyFactory(target);
//pf.setProxyTargetClass(true);
NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor();
advisor.setMappedName("execute");
advisor.setAdvice(new MessageDecorator());
pf.addAdvisor(advisor);
TaskImpl task=(TaskImpl)pf.getProxy();
System.out.println(task.getClass());
task.execute();
}
}
结果
class TaskImpl$$EnhancerByCGLIB$$26cc62
hello
run code to here
end
总结
如果满足以下列出的三种情况中的任何一种,ProxyFactory将对目标类进行基于类的代理。
如果目标类没有实现任何接口,不管proxyTargetClass的值是什么,ProxyFactory会采用基于类的代理。
如果有接口并且ProxyFactory的proxyTargetClass属性值被设置为true,ProxyFactory会采用基于类的代理。
如果有接口并且ProxyFactory的optimize属性值被设置为true,ProxyFactory会采用基于类的代理。