Spring中AOP的应用
一、介绍
- 不通过修改源代码的方式,在主要功能中 增加功能
二、AOP底层原理
三、术语
Class User{
add();
update();
}
-
连接点
- 类里哪些方法可以被增强,这些方法叫连接点
- 如:add()和update()
-
切入点
- 真正被增强的方法
-
通知(增强)
-
实际增强的逻辑部分
-
多种类型
-
前置通知
@Before(value = "execution(* test_AOP.USER.add(..))")
-
后置通知
@AfterReturning(value = "execution(* test_AOP.USER.add(..))")
-
环绕通知
@Around(value = "execution(* test_AOP.USER.add(..))")
-
异常通知
@AfterThrowing(value = "execution(* test_AOP.USER.add(..))")
-
最终通知
@After(value = "execution(* test_AOP.USER.add(..))")
-
-
-
切面
- 把通知应用到切入点的过程
四、AOP操作准备
五、AOP操作(AspectJ注解)
-
创建一个类里面定义方法
package test_AOP; public class USER { public void add(){ System.out.println("这是一个add方法-------"); } }
-
创建增强类(编写增强逻辑)
package test_AOP; //增强的类 public class USER_Proxy { public void before(){ System.out.println("这是在add 前执行的方法-------"); } }
-
进行通知的配置
(1)开启注解扫描
(2)使用注解创建User和UserProxy对象
package test_AOP; import org.springframework.stereotype.Component; @Component(value="user")//使用注解创建对象 public class USER { public void add(){ System.out.println("这是一个add方法-------"); } }
(3)在增强类上面加注解@Aspect
package test_AOP; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect//生成代理对象 //增强的类 public class USER_Proxy { public void before(){ System.out.println("这是在add 前执行的方法-------"); } }
(4)在Spring配置文件中开启生成代理对象
<!--开启Aspect生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(5)配置不同类型的通知
-
在增强类里面的通知方法上面添加通知类注解通知,使用切入点表达式
/** * 前置通知 * 表示在增强方法前执行 */ @Before(value = "execution(* test_AOP.USER.add(..))") public void before(){ System.out.println("这是在add 前执行的方法-------"); }
(6)运行结果:
-
(7)结论
调用该注解可以在执行add方法前执行插入的before方法
六、AOP操作(AspectJ注解 工具类)
//相同切入点抽取
@Pointcut(value = "execution(* test_AOP.USER.add(..))")
public void point(){}
@Before(value = "point()")
public void before(){
System.out.println("这是在add 前执行的方法-------");
}