`

用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 代理 ProxyFactoryBean 是 Spring 中用于创建 AOP 代理的重要工具类,它提供了完整的控制能力,可以生成指定的内容。下面将详细介绍 ProxyFactoryBean 的使用方法和 Spring...

    Spring AOP 源码系列:ProxyFactoryBean

    总结来说,ProxyFactoryBean是Spring AOP实现的关键组成部分,它为我们提供了创建代理对象的能力,使得我们可以灵活地在运行时增强或拦截对象的行为。通过对ProxyFactoryBean的深入理解和使用,我们可以更好地利用...

    Spring之AOP介绍

    - **使用ProxyFactoryBean创建AOP代理**:`ProxyFactoryBean`是Spring中的一个类,用于创建AOP代理。当定义了一个名为`myfactory`的`ProxyFactoryBean`时,引用`myfactory`的对象实际上获取的是`ProxyFactoryBean....

    springAop默认代理方式.zip

    Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...

    spring电子讲义

    3. **使用ProxyFactoryBean创建AOP代理**: - **ProxyFactoryBean**是Spring提供的用于创建AOP代理的工具类。 - 当引用名为`myfactory`的`ProxyFactoryBean`对象时,实际返回的是由`getObject()`方法创建的代理...

    spring-aop-ProxyFactoryBean 源码分析

    `ProxyFactoryBean`是Spring AOP实现中的一个重要类,它用于创建代理对象,使我们能够实现动态代理以进行方法拦截。下面将深入分析`ProxyFactoryBean`的源码,探讨其工作原理和使用方式。 `ProxyFactoryBean`继承自...

    Spring5.1中文参考指南.pdf

    - **使用ProxyFactoryBean创建AOP代理**:一种常用的创建AOP代理的方式。 - **使用ProxyFactory创建AOP代理**:另一种创建AOP代理的方式。 - **操作被通知的对象**:如何访问被代理的对象。 - **使用auto-proxy...

    SpringBootAopInterceptor:Spring Boot ProxyFactoryBean

    `ProxyFactoryBean`是Spring提供的一个工厂bean,用于创建AOP代理对象。它可以创建JDK动态代理或CGLIB代理,具体取决于目标对象是否实现了接口。`ProxyFactoryBean`允许我们配置拦截器、后置处理器等,这些都是在...

    aop的详细总结(包含例子)

    三、Spring AOP代理原理 Spring AOP通过两种类型的代理来实现: 1. JDK动态代理:适用于目标对象实现了接口的情况,性能较低,需要定义代理接口。 2. CGLIB代理:可以代理接口和非final类,性能较高,通过生成字节码...

    spring-aop.rar_aop1270_spring_spring aop

    6. 目标对象(Target Object):被AOP代理的对象。 7. 代理(Proxy):AOP框架创建的对象,用于在目标对象周围拦截方法调用。 二、Spring AOP实现机制 Spring AOP通过动态代理来实现,主要有两种代理方式: 1. ...

    spring源代码分析:aop的实现

    Spring的AOP代理(无论是JDK还是CGLIB)都会实现这个接口,并在intercept()方法中插入通知逻辑。 此外,Spring还提供了基于注解的AOP支持,如@Aspect、@Before、@After等,这使得AOP的使用更加便捷。在编译时,...

    Spring AOP的底层实现技术

    4. **AOP代理的创建** Spring AOP在启动时会根据配置创建代理对象。如果目标类实现了接口,将使用JDK动态代理;否则,使用CGLIB代理。代理对象在调用目标方法时会插入通知逻辑。 5. **代理对象的工作原理** 当...

    spring-aop源码解读

    ProxyFactoryBean是Spring AOP用于创建代理对象的主要工具,它实现了BeanFactoryAware、BeanClassLoaderAware和FactoryBean接口,使其能够利用IOC容器的功能来查找并应用Advice和目标对象。 配置和使用...

    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源码分析——Spring Aop

    在Spring AOP的源码中,`org.springframework.aop.framework.ProxyFactoryBean`是创建代理的主要类,它会根据目标类是否有接口选择JDK动态代理或CGLIB。`org.aopalliance.intercept.MethodInterceptor`接口定义了...

    spring-aop源码

    `ProxyFactoryBean`和`AspectJProxyFactory`是创建代理对象的关键类。`DefaultAdvisorAdapterRegistry`负责适配不同的通知类型。`MethodBeforeAdviceInterceptor`、`AfterReturningAdviceInterceptor`等类实现了不同...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    4. AOP代理对象的来源和类型 - **TargetSource(目标源)**:被代理对象的来源。 - **SingletonTargetSource**:总是返回同一个实例的TargetSource。 - **PrototypeTargetSource**:返回原型bean的TargetSource。...

    spring aop 学习笔记

    - **目标对象(Target Object)**:被AOP代理的对象。 - **代理(Proxy)**:Spring AOP创建的对象,用于实现切面的逻辑。 - **织入(Weaving)**:将切面应用到目标对象,创建代理的过程。可以发生在运行时或...

Global site tag (gtag.js) - Google Analytics