`
uule
  • 浏览: 6352790 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

用ProxyFactoryBean创建AOP代理

阅读更多

用ProxyFactoryBean创建AOP代理

 

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

 

使用 ProxyFactoryBean 来创建 AOP 代理的最重要的优点之一是 IoC 可以管理通知和切入点。 这是一个非常的强大的功能,能够实现其他 AOP 框架很难实现的特定的方法。例如,一个通知本身可以引用应用对象(除了目标对象,它在任何 AOP 框架中都可以引用应用对象),这完全得益于依赖注入所提供的可插入性。

 

1、使用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 属性中列出目标类实现的每个接口的情况是一样的。然而,这将显著地减少工作量以及输入错误的可能性。

 

通知需要实现这几个接口之一:


 

http://fruitking.iteye.com/blog/601106

 

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下

 

代理模式,JDK动态代理,SpringAOP来龙去脉
http://fruitking.iteye.com/blog/601106 (重要参考)

 

参考:http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch07s05.html

http://hi.baidu.com/javasite/blog/item/8989280358d7ed723912bb1e.html/cmtid/700035c42f8f8da28226ac95

http://hi.baidu.com/ganlanzhi/blog/item/be1dd939234a06f63b87ce7a.html

  • 大小: 42.8 KB
分享到:
评论

相关推荐

    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