Spring AOP
AOP简介
1. AOP(Aspect-OrientedProgramming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
2. AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.
3. 在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里.
4. AOP 的好处:
1) 每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
2) 业务模块更简洁, 只包含核心业务代码.
Spring AOP 使用
基于AspectJ注解
1. 加入 jar 包
1) com.springsource.net.sf.cglib-2.2.0.jar
2) com.springsource.org.aopalliance-1.0.0.jar
3) com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
4) spring-aspects-4.0.0.RELEASE.jar
2. 在 Spring 的配置文件中加入 aop 的命名空间
3. 基于注解的方式来使用 AOP
1) 基于注解的前提设置:在配置文件中配置自动扫描的包: <context:component-scan base-package="com.atguigu.spring.aop"></context:component-scan>
2) 开启AspjectJ的注释功能:加入使 AspjectJ 注解起作用的配置
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>为匹配的类自动生成动态代理对象.
4. 编写切面类:即增强功能类
1) 创建一个增强功能的类
2) 在其中添加要额外实现的功能
5. 对切面类的配置
1) 添加Bean注解:切面必须是 IOC 中的 bean: 实际添加了 @Component 注解
2) 添加切面注解: 添加 @Aspect
3) 声明通知: 即额外加入功能对应的方法
6. 在通知中访问连接细节: 可以在通知方法中添加 JoinPoint(切入点)类型的参数, 从中可以访问到被增强方法的签名和方法的参数。
注:被增强类的方法对应的类必须面向接口编程。即通过接口规定方法,类实现这个接口。在使用时,处理在IOC或的Bean的实例时,其他地方都是用接口来引用。
7. 通知注解类型
1) AspectJ 支持 5 种类型的通知注解:
a) @Before: 前置通知, 在方法执行之前执行
b) @After: 后置通知, 在方法执行之后执行
c) @AfterRunning: 返回通知, 在方法返回结果之后执行
d) @AfterThrowing: 异常通知, 在方法抛出异常之后
e) @Around: 环绕通知, 围绕着方法执行
2) 前置通知:在被增强方法前执行
@Before("execution(public intcom.atguigu.spring.aop.ArithmeticCalculator.*(int, int))")
Ø @Before 表示在目标方法执行之前执行 @Before 标记的方法的方法体.
Ø @Before 里面的是切入点表达式
3) 后置通知:在被增强方法后执行,无论该方法是否抛出异常都会执行
@After("execution(* cn.itcast.spring.aop.before.BaseService.*(int,int))")
4) 返回通知:在方法法正常结束受执行的代码,返回通知是可以访问到方法的返回值的!
5) 异常通知:
Ø 在目标方法出现异常时会执行的代码. 可以访问到异常对象;
Ø 且可以指定在出现特定异常时在执行通知代码
6) 环绕异常(了解)
Ø 环绕通知需要携带ProceedingJoinPoint 类型的参数.
Ø 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执行目标方法.
Ø 且环绕通知必须有返回值, 返回值即为目标方法的返回值
8. 指定切面优先级&使用切入点表达式
1) @Order(val):val越小优先级越高越先执行。即在外层。
2) @Pointcut:声明切入点表达式。