1. 什么是Spring AOP?
OOP:核心是对象,关注点是将需求抽象成对象
AOP: 核心是方面,关注点是将共通处理提取,动态的作用到某一批对象方法上
2. AOP相关概念
a. 方面(Aspect)
方面指的是封装共通处理逻辑的组件,可以动态作用到目标组件方法
b. 切入点(Pointcut)
切入点用于指定哪些组件是目标,要追加方面Aspect组件
切入点表达式有以下几种
--方法限定方法表达式(哪些方法用方面组件处理)
execution([修饰符] 返回类型 方法名(参数) [throws 异常])
execution(* add*(..)) 只是限制了方法名必须以add开头
--第一个*表示不限制返回值类型
--add* 表示方法名
--(..) 表示0到多个参数
execution(* com.mscncn.dao.UserDao.insert*(..))
execution(* com.mscncn.dao.*.*(..))
--匹配com.mscncn.dao包下所有类的所有方法
execution(* com.mscncn.dao..*.*(..))
--匹配com.mscncn.dao包下,及其子包下得所有类的所有的方法
--类型限定(类型匹配,则类型中所有方法都启用方面组件处理)
within(包名.类型名)
within(com.mscncn.dao..*)
--匹配com.mscncn.dao包下,及其子包下得所有类的所有方法
--Bean名称限定(利用Bean组件的id或name值限制)
bean(idOrName名)
bean(costListController)
--匹配id或者name=costListController
bean(*Controller)
--匹配id或者name以Controller结尾的bean
c. 通知(Advice)
通知用于指定方面(Aspect)和目标组件之间的作用时机。
Spring提供以下几种的通知类型,对应不同作用时机。
前置通知: 先执行方面,再执行目标方法
后置通知: 先执行目标方法,不出异常,再执行方面
异常通知: 限制性目标方法,发生异常再执行方面
最终通知: 先执行目标方法,有无异常,都要执行方面
环绕通知: 先执行方法(前半部分),在执行目标方法,最后再执行方法(后半部分)
try{
//前置通知
//环绕通知前
目标组件
//环绕通知后
//后置通知
}catch(Exception e){
//异常通知
}finally{
//最终通知
}
4. Spring AOP的使用
--分析需求编写共通处理的方面组件(Aspect)
package com.mscncn.spring.ch03.aspect;
public class LoggerBean {
public void myBefore(){
System.out.println("前置通知");
}
}
--分析需求编写切入点表达式(Pointcut)
需要切入到com.mscncn.spring.ch03包下,以及其子包下得所有类的所有方法
--分析需求选择通知类型(Advice)
前置通知
--分析完成后,配置AOP
<bean id="loggerBean" class="com.mscncn.spring.ch03.aspect.LoggerBean"></bean> <bean id="app" class="com.mscncn.spring.ch03.App"></bean> <aop:config> <!-- 将loggerBean指定为aspect组件 --> <aop:aspect id="loggerAspect" ref="loggerBean"> <!-- 指定通知类型 --> <aop:before method="myBefore" pointcut="within(com.mscncn.spring.ch03.App)"/> </aop:aspect> </aop:config>
测试:
package com.mscncn.spring.ch03;
/**
* Hello world!
*
*/
public class App {
public void ma() {
System.out.println("Hello World!");
}
}
package com.mscncn.spring.ch03.aspect;
public class LoggerBean {
public void myBefore(){
System.out.println("前置通知");
}
}
@Test
public void test1(){
ac.getBean("app",App.class).ma();
}
注意:当springMVC 使用springAOP那么配置信息必须写在SpringMVC的配置文件中。
Spring AOP环绕通知时,必须有返回值。