`
huangyiming2009
  • 浏览: 22668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用ProxyFactoryBean创建AOP代理(公司中用到的)

    博客分类:
  • work
阅读更多

用ProxyFactoryBean创建AOP代理

 

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

 

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

 

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


Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3. "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6. <bean id="log" class="com.gc.action.LogAround"/>  
  7.   
  8. <bean id="timeBook" class="com.gc.action.TimeBook"/>  
  9.   
  10. <!--设定代理类-->  
  11.   
  12. <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
  13.   
  14.              <!--这里代理的是接口-->  
  15.         <property name="proxyInterfaces">  
  16.             <value>com.gc.impl.TimeBookInterface</value>  
  17.         </property>  
  18.   
  19.                <!--是ProxyFactoryBean要代理的目标类-->  
  20.         <property name="target">  
  21.             <ref bean="timeBook"/>  
  22.         </property>  
  23.   
  24.                <!--程序中的Advice-->  
  25.         <property name="interceptorNames">  
  26.             <list>  
  27.                 <value>log</value>  
  28.             </list>  
  29.         </property>  
  30.     </bean>  
  31. </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类。代理目标类的指定方法的示例代码如下:

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3. "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6. <bean id="log" class="com.gc.action.LogAround"/>  
  7.   
  8. <bean id="timeBook" class="com.gc.action.TimeBook"/>  
  9.   
  10. <!--代理目标类的指定方法-->  
  11. <bean id="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  12.         <property name="advice">  
  13.             <ref bean="log"/>  
  14.         </property>  
  15.   
  16.                <!--指定要代理的方法-->  
  17.         <property name="patterns">  
  18.             <value>.*doAuditing.* </value>  
  19.         </property>  
  20.     </bean>  
  21.   
  22. <!--设定代理类-->  
  23. <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
  24.   
  25.         <property name="proxyInterfaces">  
  26.             <value>com.gc.impl.TimeBookInterface</value>  
  27.         </property>  
  28.   
  29.         <property name="target">  
  30.             <ref bean="timeBook"/>  
  31.         </property>  
  32.   
  33.         <property name="interceptorNames">  
  34.             <list>  
  35.                 <value>logAdvisor</value>  
  36.             </list>  
  37.         </property>  
  38.     </bean>  
  39. </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

 

 

本人摘自http://uule.iteye.com/blog/869309

分享到:
评论

相关推荐

    Spring基于ProxyFactoryBean创建AOP代理

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

    spring aop代理列子

    package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.autoproxy下为:aop方式自动代理 package com.gc.cglib下为:aop方式cglib代理 ...

    Spring AOP 源码系列:ProxyFactoryBean

    NULL 博文链接:https://czj4451.iteye.com/blog/2051461

    Spring实现AOP的四种方式

    1. 配置ProxyFactoryBean,显式地设置advisors, advice, target等(基于代理的AOP ) 2. 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象 3. 通过&lt;aop:...

    spring-aop-ProxyFactoryBean 源码分析

    NULL 博文链接:https://wangxinchun.iteye.com/blog/2079585

    AOP 和 Aspect 注解切入 测试 Demo

    显式地设置 Advisors、Advice、Target等(基于代理的AOP ),从容器内获得的就是代理对象;Advice 和 CutPoint 也可以由 IOC 管理 3.AspectJProxyFactory 基于注解的形式:@Aspect、@PointCut、@Before、@Around、@...

    spring aop 实现源代码--xml and annotation(带lib包)

    并定义了一个 org.springframework.aop.framework.ProxyFactoryBean对象(messageSender),FactoryBean或ApplicationContext将使用ProxyFactoryBean来建立代理对象,在这里就是messageSenderImpl建立代理对象。...

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

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

    SpringBootAopInterceptor:Spring Boot ProxyFactoryBean

    SpringBootAopInterceptor Spring Boot ProxyFactoryBean

    spring_教程_2_AOP

    简介AOP知识,包括概念,了解AOP 撑握理解AOP术语 理解Spring中AOP的实现 撑握通知、切入点的定义与使用 撑握ProxyFactoryBean的使用 撑握Spring自动代理的使用

    AOP实现计算器代码.zip

    使用ProxyFactory或ProxyFactoryBean实现计算器功能,同时(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当有负数参与...

    《Java EE企业开发框架》 Spring AOP实验报告

    1. 定义一个MyClass类(或接口),包括math()、english()和physics()方法,可以简单模拟输出:上数学课/英语课/物理...请选择使用JDK动态代理、CGLIB代理、ProxyFactoryBean或者AspectJ中的某一种方式来实现增强处理。

    spring in action英文版

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

    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 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. 使用...

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

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

    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 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的...

Global site tag (gtag.js) - Google Analytics