Spring AOP的配置方式

在Spring中实现AOP根据版本不同,可以有大致四种配置方式。现简单列一下。在介绍Spring的AOP配置方式前,先要注意Spring中Advisor的概念。在Spring中Advisor是Advice和Pointcut的结合,但它还不是AOP概念上的Aspect。因为在Spring中Advisor还是Spring用来生成Aspect对象的一个原型,根据配置的不同,Spring可以只对某个类生成Aspect,也可以对所有的类生成Aspect。 

1. 基于xml配置文件的代理配置方式 
这种方式在2.0以后很少用了,原因是配置项过多,过于繁琐。但对于理解Spring AOP还是很有帮助的 
1.1 定义通知 
<bean id="advice" class="yourAdviceImpl" /> 
1.2 定义切点 
要定义一个切点,可以选择使用正则表达式方式声明的切点或者AspectJ方式声明的切点。对正则表达式切点,使用Perl5RegexpMethodPointcut或JdkRegexpMethodPointcut(Java 1.4以上版本,不需要Jakarta ORO的支持了);对AspectJ切点,使用AspectJExpressPointcut 
<bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> 
    <property name="pattern"  value="yourRegularExpression" /> 
</bean> 
<bean id="pointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"> 
    <property name="expression" value="yourAspectJExpression" /> 
</bean> 
1.3 定义通知者 
DefaultPointcutAdvisor是Spring提供的默认通知者,它需要提供通知和切点的引用。 
Spring也提供了RegexpMethodPointcutAdvisor和AspectJExpressionPointcutAdvisor来对应两种声明切点的方式,不用再单独定义切点。 
<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> 
    <property name="advice" ref="advice" /> 
    <property name="pointcut" ref="pointcut" /> 
</bean> 

<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    <property name="advice" ref="advice" /> 
    <property name="pattern" value="yourRegularExpression" /> 
</bean> 

<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"> 
    <property name="advice" ref="advice" /> 
    <property name="expression" value="yourAspectjExpression" /> 
</bean> 

1.4 定义ProxyFactoryBean 
<bean id="yourBean" class="org.springframework.aop.framework.ProxyFactoryBean> 
   <property name="target" ref="yourTargetBean" /> 
   <property name="interceptorNames" value="advisor" /> 
   <property name="proxyInterfaces" value="interfaceClass" /> 
</bean> 
interceptorNames和proxyInterfaces都是数组属性,所以可以声明要使用的一个list,也可以让Spring自动把单个值转化为数组 

上面明确定义了要对那个targetBean应用代理生成切面实例。如果不想限制targetBean,可以让Spring为所有匹配切点声明的bean生成切面实例,这样就不用一个个定义ProxyFactoryBean了,只需要定义 
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> 
这是一个BeanPostProcessor,所以Spring会自动识别并在bean的声明周期使用 

2 利用2.0以后使用aop标签 
<aop:config> 
    <aop:aspect ref=""> 
        <aop:pointcut id="performance" expression="execution(* *.perform(..))" /> 
<aop:before method="" pointcut-ref="performance" /> 
<aop:before method="" pointcut="execution(* *.perform(..))" /> 
<aop:after-returning method="" pointcut="execution(* *.perform(..))" /> 
<aop:after-throwing method="" pointcut="execution(* *.perform(..))" /> 
     </aop:aspect> 
</aop:config> 

3 利用Annotation 

3.1 利用@Aspect将一个POJO类声明为一个切面。 

3.2 定义切点 
@Pointcut("execution(* *.perform(..))") 
public void performance(){} 
通过@Pointcut定义的切点的名字就是它所注解的方法的名字,因此例子中的切点名字是 
performance()。这里声明的performance()方法实际圣只是一个标记,为@Pointcut提供附加的点,并不要求有实际意义。 

3.3 定义通知 
对要执行切面的方法,通过@Before("performance()"),@AfterReturning 
("performance()")来定义通知。注意这里提供的切点名称,是performance(),而不是performance 

如果对上面的两点不是很理解,也可以省略@Pointcut,而将AspectJ表达式直接定义在@Before等通知中,将上面的两步合为一步,如@Before("execution(* *.perform(..))") 

3.4 通知Spring创建代理 
<aop:aspectj-autoproxy> 
这实际上相当于声明了一个AnnotationAwareAspectJAutoProxyCreator,从而根据@Pointcut声明的切点来自动代理匹配的bean实例 

4 在Spring中结合进AspectJ 
对于超出Spring AOP支持范围的,可以采用这种方式。只需要在Spring中配置AspectJ的Class实例时让Spring能够获得AspectJ类的实例就可以了,比如 
<bean class="a_aspectj_class" factory-method="aspectOf"> 
    <preperty ....    /> 
</bean>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值