Spring学习04-[Spring容器核心技术AOP学习]

AOP学习

AOP介绍


  • 如何在Spring中创建一个所谓切面?
    @Aspect+@Component+通知+切点
  • 切面里面的代码怎么运行在业务方法(之前、之后)?
    通知+切点

使用

实现一个对service方法的增强,添加日志

  • 添加依赖
xml 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

对业务方法添加计算时间的增强

  • 业务类
java 复制代码
@Service
public class UserService {

    public void add(){
        System.out.println("增加");
    }

    public void delete(){
        System.out.println("删除");
    }

    public void update(){
        System.out.println("修改");
    }

    public void query(){
        System.out.println("查询");
    }
}
  • 切面类
    啥叫面向切面编程:面向切面编程就是面向切面类进行编程
java 复制代码
@Aspect //标记为切面类
@Component
public class LogAspect {


    //实现方法用时 切点表达式
    @Around("execution(* com.sping.service.UserService.*(..))")
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        //记录方法用时
        long startTime = System.currentTimeMillis();
        //执行具体的方法
        try {
            joinPoint.proceed(); //连接点就是具体的方法
        }catch (Exception e){
            System.out.println("方法执行异常");
            throw new Exception();
        }

        long endTime = System.currentTimeMillis();
        System.out.println("方法用时:" + (endTime - startTime) + "ms");
        return null;
    }


}
  • 测试
java 复制代码
  @Autowired
    private UserService userService;

    @Test
    public void test() throws InterruptedException {
        userService.add();
    }

@EnableAspectJAutoProxy


AOP的术语





切面、切点、通知、连接点;顾问(通知+切点)

通知

  • 前置通知
  • 后置通知
  • 返回通知
  • 异常通知
    在定义切点的时候,可以把切点定义到另一个方法中,然后在通知中引入即可
java 复制代码
@Aspect
@Component
public class LogAspect{

    @Pointcut("execution( * com.sping.service.UserService.*(..))")
    public void PointCut(){

    }


    @AfterReturning("PointCut()")
    public void log(){
        System.out.println("后置通知执行");
    }
}

环绕通知和其他通知的区别:环绕通知需要手动去拿到连接点执行目标方法,环绕方法更加的灵活

前置通知@Before

在目标方法执行之前执行

java 复制代码
@Aspect
@Component
public class LogAspect{

    @Before("execution(* com.sping.service.*.*(..))")
    public void log(){
        System.out.println("前置通知执行");
    }
}

可以看到标注了前置通知后,前置通知的增强方法先执行,然后再执行目标方法

后置通知@After

与前置通知相反,后置通知是目标方法执行之后才会执行,通知里的增强方法

java 复制代码
@Aspect
@Component
public class LogAspect{
    @After("execution(* com.sping.service.*.*(..))")
    public void log(){
        System.out.println("后置通知执行");
    }
}

返回通知@AfterReturning

其实也是个后置通知,不过就是在方法返回后执行

相关推荐
唐青枫10 分钟前
Java RabbitMQ 实战指南:从交换机、队列到可靠消息处理
java
卓怡学长15 分钟前
w272基于springboot便民医疗服务小程序
java·spring boot·spring·小程序·intellij-idea
一方~16 分钟前
权限系统设计
java
霸道流氓气质19 分钟前
Harness Engineering 从理论到实战:基于 Spring AI Alibaba 的完整实现指南
数据库·人工智能·spring·harness
β添砖java22 分钟前
Ollama工具学习
学习
盐焗鹌鹑蛋22 分钟前
【C++】多态
java·jvm·c++
rebibabo23 分钟前
Java高并发底层原理(七)volatile 到底解决了什么问题
java·学习笔记·volatile·可见性·有序性·指令重排
名字还没想好☜1 小时前
Go 并发实战:用 channel 实现 worker pool
java·数据库·后端·golang·go
小巧的砖头1 小时前
使用SVN+CruiseControl+ANT实现持续集成之一
学习·算法
人道领域1 小时前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法