Spring AOP的实现
- Spring AOP环境搭建
- AOP坐标依赖引入
- 添加xml配置
- 实现三层架构
- 定义切入点
- @Pointcut("匹配规则")
- 切入点表达式
- 1. 执行所有的公共方法
- 2.执行任意的set方法
- 3.设置指定包下的任意类的任意方法 (指定包: com.svt.service)
- 4.设置指定包及于包下的任意类的任意方法 (指定包: com.svt.service)
- 表达式中的第一个*
- 示例
- 通知注解
- @Before-前置通知
- 示例
- @AfterReturning-返回通知
- 示例
- @After-最终通知
- 示例
- @AfterThrowing-异常通知
- 示例
- @Around-环绕通知
- 示例
Spring AOP环境搭建
首先新建一个Spring框架环境,忘记搭建步骤可以去看主页之前的怎样搭建Spring框架环境
AOP环境搭建建立在Spring环境上,然后再进行以下步骤
AOP坐标依赖引入
可以去Maven官网进行下载,也可以复制下面的依赖版本
<!--Spring AOP-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
添加xml配置
需要添加命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
添加过后的xml文件如下,要开启自动化扫描
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启自动化扫描-->
<context:component-scan base-package="com.svt"/>
</beans>
实现三层架构
完善dao层、service层以及controller层,在各自层内新建各自的类并加以注释实例化
@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Controller
public class UserController {
}
这样基本的AOP环境就搭建好了
定义切入点
@Pointcut(“匹配规则”)
切入点表达式
1. 执行所有的公共方法
execution(public *(..))
2.执行任意的set方法
execution(* set*(..))
3.设置指定包下的任意类的任意方法 (指定包: com.svt.service)
execution(* com.svt.service.*.*(..))
4.设置指定包及于包下的任意类的任意方法 (指定包: com.svt.service)
execution(* com.svt.service..*,*(..))
表达式中的第一个*
代表的是方法的修饰范围 (pubLic、private、protected)
如果取值是*,则表示所有范围
示例
@Pointcut("execution(* com.svt.service.*.*(..))")
public void cut(){
}
通知注解
@Before-前置通知
声明前置通知,并将通知应用到指定的切入点上
目标类的方法执行前,执行该通知
示例
value=""内写切入点方法
@Before(value = "cut()")
public void before(){
System.out.println("前置通知...");
}
@AfterReturning-返回通知
声明返回通知,并将通知应用到指定的切入点上
目标类的方法在无异常执行后,执行该通知
示例
@AfterReturning(value = "cut()")
public void afterReturn(){
System.out.println("返回通知...");
}
@After-最终通知
声明最终通知,并将通知应用到指定的切入点上
目标类的方法在执行后,执行该通知(有异常和无异常最终都会执行)
和finally有点像
示例
@After(value = "cut()")
public void after(){
System.out.println("最终通知...");
}
@AfterThrowing-异常通知
声明异常通知,并将通知应用到指定的切入点上
目标类的方法在执行异常时,执行该通知
示例
@AfterThrowing(value = "cut()",throwing = "e")
public void afterThrow(Exception e){
System.out.println("异常通知...======异常原因:"+e.getMessage());
}
@Around-环绕通知
声明环绕通知,并将通知应用到指定的切入点上
目标类的方法执行前后,都可通过环绕通知定义响应的处理
需要通过显示调用的方法,否则无法访问指定方法 pjp.proceed();
示例
@Around(value = "cut()")
public Object around(ProceedingJoinPoint pjp){
System.out.println("环绕通知-前置通知...");
Object object=null;
//object=pjp.proceed();
try {
//显示调用的方法
object=pjp.proceed();
System.out.println(pjp.getTarget());
System.out.println("环绕通知-返回通知...");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("环绕通知-异常通知...");
}
System.out.println("环绕通知-最终通知...");
return object;
}