Spring中的AOP
1.什么是AOP
Aop是java的spring框架中的一种特性,aop是面向切面编程的缩写,那什么是面向切面编程呢?
面向切面编程就是,在不对源码进行修改的情况下对源码所实现的功能进行增强。
举例说明
原本一个程序可以实现用户登入的功能,然后我想在这个功能的基础上,加入一个新的功能,就是对用户等级的判断,按照原来的方法我们是需要对原本程序的代码进行修改才能实现这个功能的增加。而现在我们可以通过AOP来实现不去修改源码就实现功能的增加。
2.怎么实现AOP
# 2.1AOP相关的注解介绍
AOP的注解
@Aspect
前置注解,被注解的方法将会在目标方法之前执行
@Before(value="execution(* demo1.userdao.add(..))")
后置注解,被注解的方法将会在目标方法执行之后执行
@AfterReturning(value = "execution(* demo1.userdao.add(..))")
环绕注解,被注解的方法将会之前和之后都进行执行
@Around(value = "execution(* demo1.userdao.add(..))")
异常注解,被注解的方法只会在目标方法发生异常的时候才会执行
@AfterThrowing(value = "execution(* demo1.userdao.add(..)")
最终注解,被注解的方法将在执行完所有的注解方法后再执行
@After(value="execution(* demo1.userdao.add(..))")
# 2.2实现AOP的xml配置
需要引入两个命名空间,一个是注解扫描的context,还有一个是实现aop的aop命名空间
相应的需要在sxi:schemalocation中去添加相应的路径
<?xml version="1.0" encoding="UTF-8"?>
<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 http://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="demo1"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
# 2.3实现AOP
@Aspect//增强注解
public class user {
@Before(value="execution(* demo1.userdao.add(..))")
public void before(){
System.out.println("======前置======");
}
@AfterReturning(value = "execution(* demo1.userdao.add(..))")
public void AfterReturning(){
System.out.println("========后置=======");
}
@After(value="execution(* demo1.userdao.add(..))")
public void after(){
System.out.println("========最终=======");
}
@AfterThrowing(value = "execution(* demo1.userdao.add(..)")
public void AfterThrowing(){
System.out.println("========异常=======");
}
@Around(value = "execution(* demo1.userdao.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws
Throwable {
System.out.println("环绕之前.........");
//被增强的方法执行
proceedingJoinPoint.proceed();
System.out.println("环绕之后.........");
}
}
# 2.4对相同切入点的公共化
我们将对于需要增强的方法称为切入点,而对于一个切入点,如果需要进行多次增强,就是使用多个注解对这个方法进行增强,我们可以将这个切入点表达式,也就是这个路径(value = “execution(* demo1.userdao.add(…))”)进行公共化,将设置一个这个路径获取的方法,就可以直接对路径进行获取。
//相同切入点抽取
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointdemo() {
}
//前置通知
//@Before 注解表示作为前置通知
@Before(value = "pointdemo()")
public void before() {
System.out.println("before.........");
}
# 2.5设置多个增强类的优先级
对于多个类对同一个方法的增强时,想要对这个些类的执行顺序进行设置,我们可以通过添加@Order注解来实现,()中的数字越小优先级越高。
@Component
@Aspect
@Order(1)
public class PersonProxy