Spring Boot AOP简单实现

3 篇文章 0 订阅
1 篇文章 0 订阅

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>

目录结构

ss

两种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
大家看完记得点赞呦!!!!!有什么问题博主会第一时间回复你们的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值