使用ProxyFactoryBean代理目标类的所有方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="log" class="com.gc.action.LogAround"/>
<bean id="timeBook" class="com.gc.action.TimeBook"/>
<!--设定代理类-->
<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--这里代理的是接口-->
<property name="proxyInterfaces">
<value>com.gc.impl.TimeBookInterface</value>
</property>
<!--是ProxyFactoryBean要代理的目标类-->
<property name="target">
<ref bean="timeBook"/>
</property>
<!--程序中的Advice-->
<property name="interceptorNames">
<list>
<value>log</value>
</list>
</property>
</bean>
</beans>
代码说明:
● id为log的Bean,是程序中的Advice。
● id为timeBook的Bean,是ProxyFactoryBean要代理的目标类。
● id为logProxy的Bean,就是ProxyFactoryBean。
● ProxyFactoryBean的proxyInterfaces属性,指明要代理的接口。
● ProxyFactoryBean的target属性,指明要代理的目标类 ,这个目标类实现了上面proxyInterfaces属性指定的接口。
● ProxyFactoryBean的interceptorNames属性,指明要在代理的目标类中插入的Adivce 。
● ProxyFactoryBean还有一个proxyTargetClass属性,如果这个属性被设定为“true”,说明 ProxyFactoryBean要代理的不是接口类,而是要使用CGLIB方式来进行代理,后面会详细讲解使用CGLIB方式来进行代理。
注意: ProxyFactoryBean的proxyInterfaces属性只支持使用字符串的方式进行注入,不支持使用Bean的依赖方式进行注入。
如果ProxyFactoryBean 的proxyInterfaces 属性没有 被设置,但是目标类实现了一个(或者更多) 接口,那么ProxyFactoryBean 将自动检测到这个目标类已经实现了至少一个接口, 一个基于JDK的代理将被创建 。被实际代理的接口将是目标类所实现的全部 接口;实际上,这和在proxyInterfaces 属性中列出目标类实现的每个接口的情况是一样的。然而,这将显著地减少工作量以及输入错误的可能性。