Spring in Action 入门之面向切面编程AOP
2012-11-02 17:46
731 查看
注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考。欢迎留言讨论,持续更新中~
(该部分是Spring的面向切面编程AOP)
第四章 通知Bean
在软件编程中,散布于程序中多个地点的函数被称为“交叉事务”(日志管理、权限控制等)。从概念上来说,它们一般是与程序业务逻辑分开的,但经常却是直接嵌入其中的。把这些交叉事务与业务逻辑分离开正式面向切面编程(AOP)的作用所在,由此引入面向切面编程...
Spring AOP的实现原理是:创建一个代理Bean,绑定通知者类(通知者类包含切面代码与切点),匹配相应的方法,在目标代码中嵌入执行切面的代码。
1. 通过配置来详细说明下Spring AOP的流程:(为了弄清楚原理,所以从配置讲起,虽然目前这种方式已经不常用了,Spring 2.0提供了更加优雅的解决方案。)
代理Bean的配置,ProxyFactoryBean
target:这个属性告诉ProxyFactoryBean哪个Bean需要被代理,通俗点就是哪个Bean需要运用切面代码,target配置的就是目标代码。
interceptorNames:配置通知者,通知者可以按照如下方式配置:
proxyInterfaces:应该代理目标代码中的哪个接口(这个属性其实有点重复,切点表达式基本可以匹配了,自动代理就是基于这个的升级)
2. AspectJ通过注解提供了另外一个把POJO类注解成切面的方式,比较简洁,直接在Java代码中写注解,额外的配置就是在Spring的上下文中声明一个自动代理的Bean,这样才能知道如何把@AspectJ注解的Bean转化为代理通知。
3. Aspect这种切面声明的方式已经直接在代码中修改,如果要把一个普通的POJO转化成切面,那就必须获得源代码,然后改变源代码,这点是我们不希望看到的。有没有办法,让我们可以引用任何Bean,作为切面呢? Spring 2.0提供了<aop:aspect>,是一个把POJO转化为切面的优雅方案。
总结:虽然Spring AOP对于大多数切面程序来说是足够了,但Java的构造函数与普通方法是有区别的(不能被继承),这使得Spring基于代理的AOP不能实现对象创建过程的通知。AspectJ实现的切面控制独立于Spring,提供了Spring AOP不可能实现的多种切点类型,这方面特性一般也没用到,有需要的朋友可以深入研究。
萌萌的IT人,IT人的乐园
(该部分是Spring的面向切面编程AOP)
第四章 通知Bean
在软件编程中,散布于程序中多个地点的函数被称为“交叉事务”(日志管理、权限控制等)。从概念上来说,它们一般是与程序业务逻辑分开的,但经常却是直接嵌入其中的。把这些交叉事务与业务逻辑分离开正式面向切面编程(AOP)的作用所在,由此引入面向切面编程...
Spring AOP的实现原理是:创建一个代理Bean,绑定通知者类(通知者类包含切面代码与切点),匹配相应的方法,在目标代码中嵌入执行切面的代码。
1. 通过配置来详细说明下Spring AOP的流程:(为了弄清楚原理,所以从配置讲起,虽然目前这种方式已经不常用了,Spring 2.0提供了更加优雅的解决方案。)
代理Bean的配置,ProxyFactoryBean
<bean id="duke" class="org.springframework......ProxyFactoryBean"> <property name="target" ref="dukeTarget" /> <property name="interceptorNames" value="audienceAdvisor" /> <property name="proxyInterfaces" value="com.....Performer" /> </bean>
target:这个属性告诉ProxyFactoryBean哪个Bean需要被代理,通俗点就是哪个Bean需要运用切面代码,target配置的就是目标代码。
interceptorNames:配置通知者,通知者可以按照如下方式配置:
<bean id="audienceAdvisor" class="org.springframe....AspectJExpressionPointcutAdvisor"> <property name="advise" ref="audienceAdvice" /> //通知者Bean,主要包含切面代码,需要实现MethodBeforeAdvice等接口,用来表示在目标代码执行前、后、抛出异常时候的切面代码 <property name="expression" value="execution(* *.perform(..))" /> //AspectJ的切点匹配表达式,用来监测当目标代码执行perform操作时候,触发切面代码 </bean>
proxyInterfaces:应该代理目标代码中的哪个接口(这个属性其实有点重复,切点表达式基本可以匹配了,自动代理就是基于这个的升级)
2. AspectJ通过注解提供了另外一个把POJO类注解成切面的方式,比较简洁,直接在Java代码中写注解,额外的配置就是在Spring的上下文中声明一个自动代理的Bean,这样才能知道如何把@AspectJ注解的Bean转化为代理通知。
import org.aspectJ.lang.annotation.Aspect; @Aspect //声明切面 public class Audience { @Pointcut("execution(* *.perform(..))") //定义切点 public void performance() {} @Before("performance()") //切点之前执行 public .... @AfterReturning("performance()") //切点之后执行 public ... @AfterThrowing("performance()") //切点抛出异常后执行 public ... }
3. Aspect这种切面声明的方式已经直接在代码中修改,如果要把一个普通的POJO转化成切面,那就必须获得源代码,然后改变源代码,这点是我们不希望看到的。有没有办法,让我们可以引用任何Bean,作为切面呢? Spring 2.0提供了<aop:aspect>,是一个把POJO转化为切面的优雅方案。
<aop:config> <aop:aspect ref="audience"> //切面代码Bean <aop:pointcut id="performance" expression="excution(* *.performance(..))" /> //定义切点 <aop:before method="..." pointcut-ref="performance" /> //切面代码具体方法,在切点前执行(下同) <aop:after-returnning method="..." pointcut-ref="performance" /> <aop:after-throwing method="..." pointcut-ref="performance" /> </aop:aspect> </aop:config>
总结:虽然Spring AOP对于大多数切面程序来说是足够了,但Java的构造函数与普通方法是有区别的(不能被继承),这使得Spring基于代理的AOP不能实现对象创建过程的通知。AspectJ实现的切面控制独立于Spring,提供了Spring AOP不可能实现的多种切点类型,这方面特性一般也没用到,有需要的朋友可以深入研究。
萌萌的IT人,IT人的乐园
相关文章推荐
- Spring in Action 入门之面向切面编程AOP
- SpringAOP入门-面向切面编程
- springAOP面向切面编程之日志记录功能
- Spring之面向切面编程AOP(二)
- SpringAop 9 (面向切面编程,常用于拦截器)
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)
- spring面向切面编程AOP(Aspect-orented programming)
- Spring 面向切面(AOP)编程,注解
- Spring面向切面编程AOP
- Spring AOP 面向切面编程 常见通知实现(前置,后置,环绕,异常)
- 解释通知Spring AOP 面向切面编程
- spring in action-面向切面的spring(二)
- Spring AOP 面向切面编程相关注解
- 【spring-boot】spring aop 面向切面编程初接触
- idea 实现Spring讲解(Ioc-控制反转)/Aop(面向切面的编程)
- Spring学习笔记(三)--面向切面编程AoP
- 使用Spring进行面向切面(AOP)编程
- Spring AOP面向切面编程一个简单例子和在配置过程中出现错误
- 笔记——spring基本使用(控制反转IOC、面向切面编程AOP、声明式事务)
- 【Spring in Action】Spring的AOP基础知识及切面运用