1.什么是AOP
面向切面编程
AOP底层应用动静代理
(1)有接口状况 【应用JDK动静代理】
创立代理对象
要想创立一个代理对象,须要应用Proxy类的newProxyInstance办法。这个办法有三个参数:
- 一个类加载器(class loader)。
- 一个Class对象数组,每个元素都是须要实现的接口。
- 一个调用处理器
(2)无接口状况 【应用CGLIB动静代理】
AOP术语
(1)连接点:能够被加强的办法就是连接点
(2)切入点:理论被加强的办法就是切入点
(3)告诉【加强】:理论加强办法中加强的局部
- 前置告诉 - 后置告诉 - 盘绕告诉 - 异样告诉 - 最终告诉
(4)切面:
应用AspectJ进行AOP操作
execution(权限修饰符 返回类型 类全门路 办法名称(参数列表))
(1)创立类
@Componentpublic class User { public void add(){ System.out.println("add..."); } }
(2)创立加强类
@Component@Aspectpublic class UserProxy { //前置告诉 @Before(value = "execution(* com.example.demo.entity.User.add())") public void before(){ System.out.println("before..."); } //最终告诉[有没有异样都会执行] @After(value = "execution(* com.example.demo.entity.User.add())") public void after(){ System.out.println("after..."); } //后置告诉 @AfterReturning(value = "execution(* com.example.demo.entity.User.add())") public void afterReturing(){ System.out.println("afterReturning..."); } //异样告诉 @AfterThrowing(value = "execution(* com.example.demo.entity.User.add())") public void afterThrowing(){ System.out.println("afterThrowing..."); } //盘绕告诉 @Around(value = "execution(* com.example.demo.entity.User.add())") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("around before..."); proceedingJoinPoint.proceed(); System.out.println("around after..."); }}
(3)进行告诉的配置
1. 在Spring配置文件中,开启注解开发 2. 应用注解创立User和UserProxy对象 3. 在加强类下面增加注解@Aspect 4. 在Spring配置文件中开启生成代理对象
<?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="com.example.demo.entity"></context:component-scan> <!--开启Aspect生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
(4)公共切入点抽取
@Pointcut(value = "execution(* com.example.demo.entity.User.add())") public void point(){ } //前置告诉 @Before(value = "point()") public void before(){ System.out.println("before..."); }
(5)加强类优先级【多个加强类对同一办法进行加强】
加强类上增加注解@Order(数字类型值),数字值越小优先级越高