在讲DefaultAdvisorAutoProxyCreator之前,先讲解下ProxyFactory,因为DefaultAdvisorAutoProxyCreator内部生成代理用的就是ProxyFactory
1.类继承结构
和ProxyFactoryBean基本相似
2.解析
ProxyFactory在继承了ProxyCreatorSupport之后,只要在生成代理前配置好代理对象,代理接口以及通知/通知器/拦截器,然后调用ProxyCreatorSupport的createAopProxy方法得到适配的AopProxy,在调用AopProxy的getProxy()方法即可得到代理对象,下面看下相关的源码
配置代理对象这些参数,继承了AdivsedSupport之后,默认是都有的,我们看下ProxyFactory其中一个构造函数,都是使用AdivsedSupport里的方法
public ProxyFactory(Object target) {
setTarget(target);
setInterfaces(ClassUtils.getAllInterfaces(target));
}
接下来看生成代理的部分
public Object getProxy(ClassLoader classLoader) {
return createAopProxy().getProxy(classLoader);
}
用的是ProxyCreatorSupport中的方法,ProxyFactory和ProxyFactoryBean一样,只是整合了一下
下面我们来看下ProxyFactory使用的例子
3.使用
项目结构为
使用方式为
ProxyFactory proxyFactory =new ProxyFactory();
proxyFactory.setInterfaces(HelloService.class);
proxyFactory.setTarget(new HelloServiceImpl());
proxyFactory.addAdvice(new TestBeforeAdvice());
proxyFactory.addAdvice(new TestAfterAdvice());
proxyFactory.addAdvice(new TestAroundAdvice());
HelloService helloService = (HelloService) proxyFactory.getProxy();
helloService.bye("scj");
helloService.hello("scj");
基本上和ProxyFactoryBean差不多,只不过是编程式的
附上代码地址
思考一个问题:为什么声明式要用ProxyFactoryBean,而不能用ProxyFactory,从上面例子就能看出来,我们得到代理对象需要调用getProxy方法,而在spring容器中的对象是直接反射new生成的,所以我们需要用FactoyBean的getObject方法把getProxy方法执行了