ProxyFacotryBean的方式实际上相当于Proxy+FactoryBean,适合于对单个bean的aop代理。
1. 使用举例:
<bean id="personTarget">
<property name="name"><value>jianchi</value></property>
<property name="age"><value>26</value></property>
</bean>
<bean id="myAdvisor">
<property name="someProperty"><value>Custom string property value</value></property>
</bean>
<bean id="person" >
<property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
<property name="target"><ref local="personTarget"/></property>
<property name="interceptorNames">
<list>
<value>myAdvisor</value>
</list>
</property>
</bean>
2. 类图结构
通过阅读源代码可以知道它的类结构图如下:
可以看到ProxyFactoryBean实际上实现了FactoryBean接口,因此通过它,可以无缝将被织入的对象放入到IOC容器中。
它继承了ProxyCreatorSupport的类,从结构图中也可以看到,这个类有三个子类,每个子类实际上都可以用于织入横切逻辑,实际上织入的过程基本类似,具有很大的相似性,因此spring把这些共同的逻辑放入到了他们的父类中。
其中ProxyFactory和AspectJProxyFactory主要用在程序中直接调用,AspectJProxyFactory支持采用注解的方式定义切面。
ProxyCreatorSupport继承自ProxyConfig,并实现了Advised接口,ProxyConfig定义了织入过程中的通用配置项。Advised定义了对Interceptor,Advise及Advisor的管理操作接口。
ProxyCreatorSupport定义了整个织入过程的通用逻辑,但是最终的代理对象的创建它是委托给了AopProxyFacotyr.可以看到它拥有一个AopProxyFactory属性,它是创建AopProxy的工厂类,最终的横切逻辑的织入主要是通过不同的AopProxy来进行的,spring里面实际上有两种创建Proxy的方式。
它继承了ProxyCreatorSupport的类,从结构图中也可以看到,这个类有三个子类,每个子类实际上都可以用于织入横切逻辑,实际上织入的过程基本类似,具有很大的相似性,因此spring把这些共同的逻辑放入到了他们的父类中。
其中ProxyFactory和AspectJProxyFactory主要用在程序中直接调用,AspectJProxyFactory支持采用注解的方式定义切面。
ProxyCreatorSupport继承自ProxyConfig,并实现了Advised接口,ProxyConfig定义了织入过程中的通用配置项。Advised定义了对Interceptor,Advise及Advisor的管理操作接口。
ProxyCreatorSupport定义了整个织入过程的通用逻辑,但是最终的代理对象的创建它是委托给了AopProxyFacotyr.可以看到它拥有一个AopProxyFactory属性,它是创建AopProxy的工厂类,最终的横切逻辑的织入主要是通过不同的AopProxy来进行的,spring里面实际上有两种创建Proxy的方式。

可以看到AopProxy有两个子类,分别代表采用jdk动态代理的方式创建proxy和采用cgligb创建proxy。
而AopProxyFactory工厂有个默认实现,DefaultAopProxyFactory.在创建AopProxy的时候到底是实例化哪个类呢?就必须通过AdvisedSupport类的参数来决定了,上代码:
而AopProxyFactory工厂有个默认实现,DefaultAopProxyFactory.在创建AopProxy的时候到底是实例化哪个类呢?就必须通过AdvisedSupport类的参数来决定了,上代码:
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class targetClass = config.getTargetClass();
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
return CglibProxyFactory.createCglibProxy(config);
}else {
return new JdkDynamicAopProxy(config);
}