`

用ProxyFactoryBean创建AOP代理

 
阅读更多

用ProxyFactoryBean创建AOP代理

使用Spring提供的类org.springframework.aop.framework.ProxyFactoryBean是创建AOP的最基本的方式。

1  使用ProxyFactoryBean代理目标类的所有方法

在Spring中,ProxyFactoryBean是在XML中进行配置的,它的示例代码如下:

<?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>

               <!--程序中的Advice-->

        <property name="target">

            <ref bean="timeBook"/>

        </property>

               <!--是ProxyFactoryBean要代理的目标类-->

        <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的依赖方式进行注入。

2  使用ProxyFactoryBean代理目标类的指定方法

在上面的示例中,Advice会代理目标类的所有方 法。如果要代理目标类的指定方法,则需要使用Spring提供的 org.springframework.aop.support.RegexpMethodPointcutAdvisor类。代理目标类的指定方法的 示例代码如下:

<?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="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

        <property name="advice">

            <ref bean="log"/>

        </property>

               <!--指定要代理的方法-->

        <property name="patterns">

            <value>.*doAuditing.* </value>

        </property>

    </bean>

<!--设定代理类-->

<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>com.gc.impl.TimeBookInterface</value>

        </property>

        <property name="target">

            <ref bean="timeBook"/>

        </property>

        <property name="interceptorNames">

            <list>

                <value>logAdvisor</value>

            </list>

        </property>

    </bean>

</beans>

代码说明:

  ●       在id为logAdvisor的Bean中设定Advice和要指定的方法。

  ●       把id为logProxy的Bean的interceptorNames属性值改为logAdvisor。

  ●       logAdvisor的advice属性指定Advice。

  ●       logAdvisor的patterns属性指定要代理的方法。“.doAuditing”表示只有doAuditing()方法才使用指定的Advice。

patterns属性值使用的是正则表达式,关于正则表达式的使用,下节将会进行讲解。

% 注意: 因为要使用正则表达式,所以要把spring-framework-2.0-m1\lib\oro目录下的
jakarta-oro-2.0.8.jar加入到ClassPath下,加入方法可参考第2章。

3  正则表达式简介

正则表达式最早是由数学家Stephen Kleene于1956年在对自然语言的递增研究成果的基础上提出来的。正则表达式并非一门专用语言,但它可用于在一个文件中查找字符。下面把几个常用的进行一下讲解:

(1)“.”,可以用来匹配任何一个字符。比如:正则表达式为“g.f”,它就会匹配“gaf”、“g1f”、“g*f”和“g #f”等。

(2)“[]”,只有[]里指定的字符才能匹配。比如:正则表达式为“g[abc]f”,它就只能匹配“gaf”、“gbf”和“gcf”,而不会匹配“g1f”、“g*f”和“g#f”等。

(3)“*”,表示匹配次数,可以任意次,用来确定紧靠该符号左边的符号出现的次数。比如:正则表达式为“g.*f”,它能匹配“gaf”、“gaaf”、“gf”和“g*f”等。

(4)“?”,可以匹配0或1次,用来确定紧靠该符号左边的符号出现的次数。比如:正则表达式为“g.?f”,它能匹配“gaf”“g*f”等。

(5)“\”,是正则表达式的连接符。比如:正则表达式为“g.\-f”,它能匹配“g-f”、“ga-f”和“g*-f”等。

上面的示例中,只对TimeBook类的doAuditing()方法有效,如果要对TimeBook类中所有以do开头的方法有效,可以这样设定“.*do.*”,示例代码如下:

<?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="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

        <property name="advice">

            <ref bean="log"/>

        </property>

          /*对所有以do开头的方法有效*/

        <property name="patterns">

            <value>.*do.* </value>

        </property>

    </bean>

<!--设定代理类-->

<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>com.gc.impl.TimeBookInterface</value>

        </property>

        <property name="target">

            <ref bean="timeBook"/>

        </property>

               <!--指定要代理的类-->

        <property name="interceptorNames">

            <list>

                <value>logAdvisor</value>

            </list>

        </property>

    </bean>

</beans>

上述代码对TimeBook类中所有以do开头的方法都有效。如果要对TimeBook类中所有方法有效,可以这样设定“.*com\.gc\.impl\.TimeBookInterface.*”,示例代码如下:

<?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="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

        <property name="advice">

            <ref bean="log"/>

        </property>

           /*注意包路径的定义*/

        <property name="patterns">

            <value> .*com\.gc\.impl\.TimeBookInterface.*</value>

        </property>

    </bean>

<!--设定代理类-->

<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>com.gc.impl.TimeBookInterface</value>

        </property>

        <property name="target">

            <ref bean="timeBook"/>

        </property>

               <!--指定要代理的类-->

        <property name="interceptorNames">

            <list>

                <value>logAdvisor</value>

            </list>

        </property>

    </bean>

</beans>

分享到:
评论

相关推荐

    Spring基于ProxyFactoryBean创建AOP代理

    主要介绍了Spring基于ProxyFactoryBean创建AOP代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring 2.0 开发参考手册

    7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. ...

    Spring中文帮助文档

    7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用...

    spring chm文档

    7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. ...

    Spring API

    7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用...

    Spring 自动代理创建器详细介绍及简单实例

    在经典的Spring Aop中,Spring提供了自动代理创建器(Aotu proxy creator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了。 接口Animal和Book:  package com.zzj.aop; public ...

    spring in action英文版

     3.5 使用ProxyFactoryBean  3.6 自动代理  3.6.1 BeanNameAutoProxyCreator  3.6.2 DefaultAdvisorAutoProxyCreator  3.6.3 元数据自动代理  3.7 小结 第二部分 Spring在业务层的应用  第4章...

    使用FactoryBean结合Jmock实现动态Mock类的注入

    FactoryBean:我们在使用Spring过程中一般都是使用基本的的配置,在Spring配置中,还有一种特殊的FactoryBean,这种bean,可以动态的帮我们创建我们需要的bean,如: ProxyFactoryBean,通用的用于获得AOP代理的工厂bean。...

    Spring in Action(第2版)中文版

    4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的...

    Spring in Action(第二版 中文高清版).part2

    4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1...

    Spring in Action(第二版 中文高清版).part1

    4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1...

    Java Web程序设计教程

    12.1.3java动态代理与aop 244 12.1.4springaop简介 245 12.2使用spring的通知 246 12.2.1beforeadvice 246 12.2.2afterreturningadvice 248 12.2.3methodinterceptor 249 12.2.4throwadvice 250 12.3使用...

Global site tag (gtag.js) - Google Analytics