Spring Boot AOP
AOP 的概述
1.1 什么是 AOP
Spring 是解决实际开发中的一些问题: AOP 解决 OOP 中遇到的一些问题.是 OOP 的延续和扩展.
1.2 为什么学习 AOP
对程序进行增强:不修改源码的情况下.
AOP 可以进行权限校验,日志记录,性能监控,事务控制.
1.3 Spring 的 AOP 的由来:
AOP 最早由 AOP 联盟的组织提出的,制定了一套规范.Spring 将 AOP 思想引入到框架中,必须遵守 AOP 联盟的规范.
1.4 底层实现:
代理机制:
Spring 的 AOP 的底层用到两种代理机制:
JDK 的动态代理 :针对实现了接口的类产生代理.
Cglib 的动态代理 :针对没有实现接口的类产生代理. 应用的是底层的字节码增强的技术 生成当前类的子类对象.
1.5Spring AOP 开发方式
Spring有两套AOP的开发方式
1.51Spring传统方式(繁琐,不用了)
1.5.2 Spring 基于 AspectJ的AOP开发(常用)
1.6 Spring 底层 AOP 的实现原理:(了解)
JDK 动态代理增强一个类中方法:
Cglib 动态代理增强一个类中的方法:
AOP 的开发中的相关术语:
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指 的是方法,因为 spring 只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,
Introduction 可以在运行期为类动态地添加一些方法或 Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合
Spring 切入点表达式
execution(表达式)
语法:[方法访问修饰符] 方法返回值 包名.类名.方法名(方法的参数)
public * cn.hwua.spring.dao..(…)
- cn.hwua.spring.dao..(…)
- cn.hwua.spring.dao.UserDao+.*(…) 当前类及其子类下的所有方法
- cn.hwua.spring.dao….(…) 当前包或子包下的所有类所有方法
Spring的注解的AOP的通知类型
@Before :前置通知
@AfterReturning :后置通知
@Around :环绕通知
@AfterThrowing :异常抛出通知
@After :最终通知
AOP具体实现
pom.xml
在此之前需要拥有一个Spring boot项目:https://blog.csdn.net/d528071941/article/details/106408594
<!-- aop依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
目录结构
两种AOP写法
这两个类通用的:
@Component
public class AopDao {
public void getBefore(){
System.out.println("我操作数据库:");
}
@AopNote
public void getBeforeTWO(){
System.out.println("我是巨无霸:");
}
}
@Controller
public class AopController {
@Autowired
AopDao aopDao;
@RequestMapping("/aop")
@ResponseBody
String aopDemo() {
System.out.println("=========================");
aopDao.getBefore();
return "success";
}
@RequestMapping("/aopNote")
@ResponseBody
String aopNoteDemo() {
System.out.println("=========================");
aopDao.getBeforeTWO();
return "success";
}
}
第一种
@Aspect
@Component
public class AopDemo {
@Before(value = "execution(* study.startspringboot.aop.AopDao.getBefore())")
public void getDemo(){
System.out.println("用户要操作数据库了-----------------");
}
}
第二种
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AopNote {
String value() default "";
}
@Aspect
@Component
public class AopNoteDemo {
@Before(value ="@annotation(study.startspringboot.aop.AopNote)")
public void getDemo(){
System.out.println("我是注解开发AOP-----------------");
}
}
结尾
博主用的Spring boot是2.3.0版本的,但是2.3.0貌似没有AOP这和兼容的包,推荐使用2.1.0可以完美运行上面的代码
顺便代码也传到IGit上:https://github.com/aloneoneself/springStudy
大家看完记得点赞呦!!!!!有什么问题博主会第一时间回复你们的