- Aspect :日志,安全等功能
- Join point:函数执行或者属性访问
- Advice:在某个函数执行点上执行的切面功能
- Pointcut:匹配横切目标函数的表达式
Advice类型
- Before : 函数执行之前
- After returning : 函数正常返回之后
- After throwing : 函数抛出异常之后
- After finally : 函数返回之后
- Around : 函数执行前后
AOP目的:
非完整AOP实现
主目标:整合AOP与IoC
AOP使用
定义Aspectj (日志,安全等功能)
导入AOP要用到的包到 pom.xml 并且在 applicationContext.xml 文件定义如下:
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
package cn.Controller;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggingAspect {
}
<bean id="loggingAspect" class="cn.Controller.LoggingAspect"></bean>
定义Pointcut (匹配横切目标函数的表达式)
@Before("execution(* cn.Controller.Calculate.*(..))")
-Pointcut表达式
execution(modifiers ? return-type declaring-type? name(param) throws?)
- 修饰符匹配(modifiers?)
- 返回值匹配(ret-type)可以为*表示任何返回值,全路径的类名等
- 类路径匹配(declaring-type?)
- 方法名匹配(name-param)可以指定方法名 或者 * 代表所有, set 代表以set开头的所有方法
- 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(…)表示零个或多个任意参数
- 异常类型匹配(throws-pattern?)
- 其中后面跟着“?”的是可选项
例:
- 所有public函数
execution(public * * (..))
private void publicMethod()
- 所有以save开头的函数
execution(save * * (..))
private void saveMethod()
- 所有以save开头的public函数
execution(publicMethod()&&saveMethod)
private void publicSaveMethod()
定义Advice
- 函数返回之前
@Before("com.netease.course.LoggingAspect.arithmetic()")
public void doLog(){
}
或
@Before("execution(* com.netease.course.Caculator.*(..))")
public void doLog(){
}
- 函数返回之后
@AfterReturning("com.netease.course.LoggingAspect.arithmetic()")
public void doLog(){
}
- 函数抛出异常之后
@AfterThrowing("com.netease.course.LoggingAspect.arithmetic()")
public void doLog(){
}
- 函数返回值之后
@After("com.netease.course.LoggingAspect.arithmetic()")
public void doLog(){
}
函数上下文信息
函数内定义参数 :JoinPoint jp (Object 类型 )@Before
@Aroud ProceedingJoinPoint pjp (具体执行)
- 返回值处理
@AfterReturning(
pointcut="com.netease.course.LoggingAspect.arithmetic()",
returning="retVal")
public void doLog(Object retVal){ //进行返回值处理
}
- 异常处理
@AfterReturning(
pointcut="com.netease.course.LoggingAspect.arithmetic()",
throwing="ex")
public void doLog(Object retVal){ //进行返回值处理
}
- 目标参数返回
@Before("com.netease.course.LoggingAspect.arithmetic() && args(a,..)")
public void doLog(JoinPoint jp,int a){
}