spring-AOP

Spring3.0 AOP 详解

1. 一什么是AOP

2. 二AOP 的作用

3. 三AOP 的实现原理

4. 四Spring 中对AOP 的支持

5. 五Spring 中AOP 的实现

1. 基于Annotation 的零配置方式

1. 1首先启用Spring 对AspectJ 切面配置的支持

2. 2定义切面Bean

3. 3定义Before 增强处理

4. 4定义AfterReturning 增强处理

5. 5定义AfterThrowing 增强处理

6. 6定义After 增强处理

7. 7Around 增强处理

8. 8访问目标方法的参数

9. 9定义切入点

2. 基于XML 配置文件的管理方式

一、什么是AOP。

AOP(Aspect Orient Programming),也就是面向切面编程。可以这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程。

二、AOP 的作用。

常常通过AOP 来处理一些具有横切性质的系统性服务,如事物管理、安全检查、缓存、对象池管理等,AOP 已经成为一种非常常用的解决方案。

三、AOP 的实现原理。

如图:AOP 实际上是由目标类的代理类实现的。AOP 代理其实是由AOP 框架动态生成的一个对象,该对象可作为目标对象使用。A OP 代理包含了目标对象的全部方法,但AOP 代理中的方法与目标对象的方法存在差异,AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。

四、Spring 中对AOP 的支持

Spring 中AOP 代理由Spring 的IoC 容器负责生成、管理,其依赖关系也由IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他Bean 实例作为目标,这种关系可由IoC 容器的依赖注入提供。Spring 默认使用Java 动态代理来创建AOP 代理,这样就可以为任何接口实例创建代理了。当需要代理的类不是代理接口的时候,Spring 自动会切换为使用CGLIB 代理,也可强制使用CGLIB。

AOP 编程其实是很简单的事情。纵观AOP 编程,其中需要程序员参与的只有三个部分:

?定义普通业务组件。

?定义切入点,一个切入点可能横切多个业务组件。

?定义增强处理,增强处理就是在AOP 框架为普通业务组件织入的处理动作。

所以进行AOP 编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP 框架将会自动生成AOP 代理,即:代理对象的方法= 增强处理+ 被代理对象的方法。

五、Spring 中AOP 的实现。

Spring 有如下两种选择来定义切入点和增强处理。

?基于Annotation 的“零配置”方式:使用@Aspect、@Pointcut等Annotation 来标注切入点和增强处理。

?基于XML 配置文件的管理方式:使用Spring 配置文件来定义切入点和增强点。

1、基于Annotation 的“零配置”方式。

(1)、首先启用Spring 对@AspectJ 切面配置的支持。

1.

2.

3. xmlns:xsi="https://www.360docs.net/doc/1c13700947.html,/2001/XMLSchema-instance"

4. xmlns:aop="https://www.360docs.net/doc/1c13700947.html,/schema/aop"

5. xsi:schemaLocation="https://www.360docs.net/doc/1c13700947.html,/schema/beans

6. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-beans-3.0.xsd

7. https://www.360docs.net/doc/1c13700947.html,/schema/aop

8. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-aop-3.0.xsd">

9.

10.

11.

如果不打算使用Spring 的XML Schema 配置方式,则应该在Spring 配置文件中增加如下片段来启用@AspectJ 支持。

1.

2.

(2)、定义切面Bean。

当启动了@AspectJ 支持后,只要在Spring 容器中配置一个带@Aspect 注释的Bean,Spring 将会自动识别该Bean 并作为切面处理。

1.// 使用@Aspect 定义一个切面类

2.@Aspect

3.public class LogAspect {

4.// 定义该类的其他内容

5. ... }

(3)、定义Before 增强处理。

1.// 定义一个切面

2.@Aspect

3.public class BeforeAdviceTest {

4.// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

5.@Before("execution(* com.wicresoft.app.service.impl.*.*(..))")

6.public void authorith(){

7. System.out.println("模拟进行权限检查。");

8. }

9.}

上面使用@Before Annotation 时,直接指定了切入点表达式,指定匹

配com.wicresoft.app.service.impl包下所有类的所有方法执行作为切入点。关于这个表达式的规则如下图。

(4)、定义AfterReturning 增强处理。

1.// 定义一个切面

2.@Aspect

3.public class AfterReturningAdviceTest {

4.// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

5.@AfterReturning(returning="rvt", pointcut="execution(* com.wicresoft.app

.service.impl.*.*(..))")

6.public void log(Object rvt) {

7. System.out.println("模拟目标方法返回值:" + rvt);

8. System.out.println("模拟记录日志功能...");

9. }

10.}

(5)、定义AfterThrowing 增强处理。

1.// 定义一个切面

2.@Aspect

3.public class AfterThrowingAdviceTest {

4.// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

5.@AfterThrowing(throwing="ex", pointcut="execution(* com.wicresoft.app.se

rvice.impl.*.*(..))")

6.public void doRecoverActions(Throwable ex) {

7. System.out.println("目标方法中抛出的异常:" + ex);

8. System.out.println("模拟抛出异常后的增强处理...");

9. }

10.}

(6)、定义After 增强处理。

After 增强处理与AfterReturning 增强处理有点相似,但也有区别:

?AfterReturning 增强处理处理只有在目标方法成功完成后才会被织入。

?After 增强处理不管目标方法如何结束(保存成功完成和遇到异常中止两种情况),它都会被织入。

1.// 定义一个切面

2.@Aspect

3.public class AfterAdviceTest {

4.// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

5.@After("execution(* com.wicresoft.app.service.impl.*.*(..))")

6.public void release() {

7. System.out.println("模拟方法结束后的释放资源..."); }

8.}

(7)、Around 增强处理

Around 增强处理近似等于Before 增强处理和 AfterReturning 增强处理的总和。它可改变执行目标方法的参数值,也可改变目标方法之后的返回值。

[java]view plaincopyprint?

1.// 定义一个切面

2.@Aspect

3.public class AroundAdviceTest {

4.// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

5.@Around("execution(* com.wicresoft.app.service.impl.*.*(..))")

6.public Object processTx(ProceedingJoinPoint jp) throws https://www.360docs.net/doc/1c13700947.html,ng.Throwab

le {

7. System.out.println("执行目标方法之前,模拟开始事物...");

8.// 执行目标方法,并保存目标方法执行后的返回值

9. Object rvt = jp.proceed(new String[]{"被改变的参数"});

10. System.out.println("执行目标方法之前,模拟结束事物...");

11.return rvt + "新增的内容";

12. }

13.}

(8)、访问目标方法的参数。

访问目标方法最简单的做法是定义增强处理方法时将第一个参数定义为JoinPoint 类型,当该增强处理方法被调用时,该JoinPoint 参数就代表了织入增强处理的连接点。JoinPoint 里包含了如下几个常用方法。

?Object[] getArgs(): 返回执行目标方法时的参数。

?Signature getSignature(): 返回被增强的方法的相关信息。

?Object getTarget(): 返回被织入增强处理的目标对象。

?Object getThis(): 返回AOP 框架为目标对象生成的代理对象。

提示:当时使用Around 处理时,我们需要将第一个参数定义为ProceedingJoinPoint 类型,该类型是JoinPoint 类型的子类。

(9)、定义切入点。

所谓切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称。

Spring 切入点定义包含两个部分:

?一个切入点表达式。

?一个包含名字和任意参数的方法签名。

[java]view plaincopyprint?

1.// 使用@Pointcut Annotation 时指定切入点表达式

2.@pointcut("execution * transfer(..)")

3.// 使用一个返回值为void,方法体为空的方法来命名切入点

4.private void anyOldTransfer(){}

5.

6.// 使用上面定义的切入点

7.@AfterReturning(pointcut="anyOldTransfer()", returning="reVal")

8.public void writeLog(String msg, Object reVal){

9. ...

10.}

2、基于XML 配置文件的管理方式。

?不配置切入点

[java]view plaincopyprint?

1.

2.

3. xmlns:xsi="https://www.360docs.net/doc/1c13700947.html,/2001/XMLSchema-instance"

4. xmlns:aop="https://www.360docs.net/doc/1c13700947.html,/schema/aop"

5. xsi:schemaLocation="https://www.360docs.net/doc/1c13700947.html,/schema/beans

6. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-beans-3.0.xsd

7. https://www.360docs.net/doc/1c13700947.html,/schema/aop

8. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-aop-3.0.xsd">

9.

10.

11.

>

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

配置切入点

[java]view plaincopyprint?

1.

2.

3. xmlns:xsi="https://www.360docs.net/doc/1c13700947.html,/2001/XMLSchema-instance"

4. xmlns:aop="https://www.360docs.net/doc/1c13700947.html,/schema/aop"

5. xsi:schemaLocation="https://www.360docs.net/doc/1c13700947.html,/schema/beans

6. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-beans-3.0.xsd

7. https://www.360docs.net/doc/1c13700947.html,/schema/aop

8. https://www.360docs.net/doc/1c13700947.html,/schema/beans/spring-aop-3.0.xsd">

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

相关主题
相关文档
最新文档