用ProxyFactoryBean创建AOP代理
使用Spring提供的类org.springframework.aop.framework.ProxyFactoryBean是创建AOP的最基本的方式。
5.7.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的依赖方式进行注入。
5.7.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章。
5.7.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>
上述代码对TimeBook类中所有的方法都有效。
%注意:包的路径要用“\”连接符来表示“.”不是正则表达式的“.”。
分享到:
相关推荐
AOP代理是实现这一功能的关键机制。下面将详细解释Spring中的Aop代理。 1. AOP的基本概念: AOP的核心思想是将关注点分离,即将横切关注点(如日志、事务)与业务逻辑分离,使得代码更加模块化,易于维护。切面是...
Spring 提供了两种方式来实现AOP代理:JDK动态代理和CGLIB代理。 1. **JDK动态代理**: - JDK动态代理基于Java的接口实现,适用于目标对象实现了接口的情况。Spring会为这个接口创建一个代理类,代理类在调用真实...
Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...
描述中的"自己写的aop代理spring"意味着我们将学习如何自定义AOP代理来增强Spring的功能。在Spring中,有两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的类,而CGLIB代理则用于没有接口或者...
本篇将深入探讨如何在Spring中半自动地实现AOP代理。 首先,理解AOP的概念是至关重要的。AOP通过将关注点(如日志)与核心业务逻辑分离,提高了代码的可读性和可维护性。在Spring中,AOP代理有两种实现方式:JDK...
**AOP代理与Spring框架实现** 面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在将关注点分离,使我们能够更有效地管理代码中的横切关注点,如日志、事务管理、权限控制等。在Java世界...
在学习java面向过程中,关于AOP代理这块,当时思路不是很清晰,借鉴了很多资料进行了解,后面把自己的一些见解整理成浅显的笔记进行加深印象,现在把它分享给学习AOP代理思路的朋友们,希望我的一点浅显的总结能够...
### Spring AOP 代理模式详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个核心组件之一,主要用于实现横切关注点(Cross-cutting Concerns)的模块化。在软件开发中,常常会遇到...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
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 代理一、两种代理方式1. JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。二
分页进阶-使用redis实现基础分页缓存(一)使用aop代理
Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...
AOP通过代理机制实现了这一目标,代理可以在方法调用前后插入额外的代码,实现对原有功能的增强。 在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 1. **静态代理**:在静态代理中,我们需要手动创建...
Spring 基于 ProxyFactoryBean 创建 AOP 代理 ProxyFactoryBean 是 Spring 中用于创建 AOP 代理的重要工具类,它提供了完整的控制能力,可以生成指定的内容。下面将详细介绍 ProxyFactoryBean 的使用方法和 Spring...
5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...
代理模式在Java中通常与面向切面编程(AOP)结合,实现动态代理,用于增强代码的功能,比如日志、事务管理等。本文将深入探讨“代理AOP”这一主题,基于提供的文件名,我们可以推测这是一个关于Java AOP实现的实例。...
在Spring AOP代理过的对象上支持dubbo annotation配置事物失效问题-附件资源
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
Spring提供了两种AOP代理方式:JDK动态代理和CGLIB。如果目标对象实现了至少一个接口,Spring会选择JDK动态代理;如果没有实现接口,Spring则会使用CGLIB代理。 AOP在Spring中的实现还涉及了切点(Pointcut)、通知...