AOP是一种设计思想,在不修改源代码的状况下给程序动态统一添加额外功能的一种技术,如图:spring
AOP底层基于代理机制(动态方式)实现功能扩展:
1):假如目标对象(被代理对象)实现接口,则底层能够采用JDK动态代理机制为目标对象建立代理对象(目标类和代理类会实现共同接口)。
2):假如目标对象(被代理对象)没有实现接口,则底层能够采用CGLIB代理机制为目标对象建立代理对象(默认建立的代理类会继承目标对象类型)。
如图:spring-boot
spring.aop.proxy-target-class=falseui
切面(aspect):通常为一个具体类(@Aspect注解注释)切入点()spa
通知(Advice):在切面的某个特定点上执行的扩展设计
切入点(pointcut):使用@Pointcut注解进行切入点的描述,使用bean表达式定义切入点,语法:bean(spring容器中管理的某个bean的名字),bean表达式是一种粗粒度的切入点表达式(不能具体到bean中哪一个方法)需写一个方法做为承载切入点代理
链接点(joinpoint):封装了切入点集合方法中的某个正在执行的目标方法code
<dependency> <groupId>org.springframework.boot</groupId>对象
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>blog
1.@Before。(目标方法执行以前执行)
2.@AfterReturning。(目标方法成功结束时执行)
3.@AfterThrowing。(目标方法异常结束时执行)
4.@After。(目标方法结束时执行)
5.@Around.(重点掌握,目标方法执行先后均可以作业务拓展)(优先级最高)继承
说明:在切面类中使用什么通知,由业务决定,并非说,在切面中要把全部通知都写上。
**
bean表达式(重点)
bean表达式通常应用于类级别,实现粗粒度的切入点定义,案例分析:
说明:bean表达式内部的对象是由spring容器管理的一个bean对象,表达式内部的名字应该是spring容器中某个bean的name。
缺陷:不能精确到具体方法,也不能针对于具体模块包中的方法作切入点设计
===========================================================
within表达式(了解)
within表达式应用于类级别,实现粗粒度的切入点表达式定义,案例分析:
within表达式应用场景分析:
1)对全部业务bean都要进行功能加强,可是bean名字又没有规则。
2)按业务模块(不一样包下的业务)对bean对象进行业务功能加强。
===========================================================
execution表达式(了解)
execution表达式应用于方法级别,实现细粒度的切入点表达式定义,案例分析:
语法:execution(返回值类型 包名.类名.方法名(参数列表))。
===========================================================
@annotation表达式(重点)
@annotaion表达式应用于方法级别,实现细粒度的切入点表达式定义,案例分析
其中:RequiredLog为咱们本身定义的注解,当咱们使用@RequiredLog注解修饰业务层方法时,系统底层会在执行此方法时进行日扩展操做。
切面的优先级须要借助@Order注解进行描述,数字越小优先级越高,默认优先级比较低。列如:@Order(1),@Order(2)