续 Spring AOP编程 【学习笔记 理论篇】https://blog.csdn.net/kedongyu_/article/details/81387140
AOP编程模式
1.旧版本的Spring AOP编程模式:
编写Advice类必须实现指定的接口。
当程序执行指定方法前切入:实现Advice接口:MethodBeforeAdvice
当程序执行指定方法后切入:实现Advice接口:AfterReturningAdvice
当指定方法(程序)发生异常抛出后切入:实现Advice接口:ThrowsAdvice
在指定方法前后切入:实现环绕Advice接口:MethodInterceptor
2.新版的Spring AOP 模式
使用POJO(Plain Old Java Object)类即可作为切面类,即不需继承任何类(Object除外)也不实现任何接口就可以作为切面类。
新版的Spring AOP编程
1.查看pom.xml是否导入相关的类库spring-aspects,添加以下代码进行导入:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
2.编写一个POJO class,这里命名为:ServiceMethodAdvice.class
3.在类级别增加注解类@Aspect
4.在Spring的IoC配置文件中启用AspectJ的注解。
<aop:aspectj-autoproxy/>
5.添加@Component注解,让Spring对切面类进行管理,这里Spring使用自动扫描注入。
Spring只支持方法的运行:方法前,方法后,方法前后,抛出异常后
Types of advice(切面代码的类型):
方法前Advice:使用@Before注解切面(也就是一个切面类里面的函数),表示该切面在指定方法(切入点)前切入。
方法后Advice:使用@After注解切面,表示该切面在指定方法(切入点)前切入。
异常抛出后Advice:使用@AfterThrowing注解切面,表示当指定方法抛出异常后切入。
环绕Advice:使用@Around注解切面,表示在指定方法前后切入。
例子:
@Before的使用:
@Before("execution(* com.neusoft.first.service.impl.*.*(..))")
public void runBeforeMethod(JoinPoint jp) throws Exception{
System.out.println("业务层方法前Advice...");
}
其中"execution(* com.neusoft.first.service.impl.*.*(..))"指定其接入点,也就是包com.neusoft.first.service.impl下任何方法体,不限返回值,不限参数,都进行拦截切入。
@After的使用:
@After("execution(* com.neusoft.first.service.impl.*.*(..))")
public void runAfterMethod(JoinPoint jp) throws Exception{
System.out.println("业务层方法后Advice...");
}
@Around的使用
@Around("execution(* com.neusoft.first.service.impl.*.*(..))")
public Object runAroundMethod(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("业务层方法前");
//...程序...
Object obj=pjp.proceed();//执行业务层程序,可固定不变。
//...程序...
System.out.println("业务层方法后");
return obj;
}
@AfterThrowing的使用
@AfterThrowing(value="execution(* com.neusoft.first.service.impl.*.*(..))",throwing="exception")
public void serviceExceptionHandler(JoinPoint jp,Exception exception) throws Exception {
System.out.println("发生异常");
}
运行程序: