zoukankan      html  css  js  c++  java
  • 峰哥说技术:17-Spring Boot整合AOP

    Spring Boot深度课程系列

    峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动

    17  峰哥说技术:Spring Boot整合AOP

    AOP是Aspect Oriented Programming 的缩写,意为面向切面编程。面向切面编程的目标就是分离关注点。什么是关注点呢?就是关注点,就是你要做的事情。它可以灵活组合,达到一种可配置的、可插拔的程序结构。它的一些常用的概念需要了解一下。

    1)joinpoint (连接点):类里面可以被增强的方法即为连接点。例如,想修改哪个方法的功能,那么该方法就是一个连接点。

    2)pointcut(切入点): Joinpoint 进行拦截的定义即为切入点,例如,拦截所有以 insert 开始的方法,这个定义即为切入点。

    3)advice (通知或者增强):拦截到 joinpoint 之后所要做的事情就是通知。例如打印日志监控通知分为后置通知、后通知、异常通知、最终通知和环绕通知。

    4)aspect (切面): pointcut advice 的结合。

    5)target (目标对象):要增强的类称为 target 

    6)代理对象: 其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。

    Spring Boot中对于AOP的支持使用非常简单。我们只需要添加spring-boot-starter-aop依赖。后面的使用和Spring框架中的使用没有什么区别。

    案例:对于UserService类中的方法进行日志的各种增强处理。

    步骤:

    1)创建Spring Boot工程chapter04-aop.并添加web和aop依赖。我们在web环境下进行测试。

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    2)编写UserService类。

    @Service
    public class UserService {
        public String getUserById(Integer id){
            System.out.println("get...");
            return "user";
        }
        public String deleteUserById(Integer id){
            System.out.println("delete...");
            return "delete";
        }
    }

    3)创建增强的切面类LogAspect.

    @Component
    @Aspect
    public class LogAspect {
        //定义了切入点
        @Pointcut("execution(* com.java.chapter04aop.service.*.*(..))")
        public void pc(){
        }
        //前置通知
        @Before(value = "pc()")
        public void before(JoinPoint jp){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法开始执行=======");
        }
        //后置通知
        @After(value = "pc()")
        public void after(JoinPoint jp){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法结束=======");
        }
        //最终通知
        @AfterReturning(value = "pc()",returning = "result")
        public void afterReturning(JoinPoint jp,Object result){
            String name = jp.getSignature().getName();
            System.out.println(name+"的返回值是:"+result);
        }
        //异常通知
        @AfterThrowing(value = "pc()",throwing = "e")
        public void afterThrowing(JoinPoint jp,Exception e){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法的异常是:"+e.getMessage());
        }
        //环绕通知
        @Around(value = "pc()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            return pjp.proceed();
        }
    }

    4)编写UserController

    @RestController
    public class UserController {
        @Autowired
        private UserService userService;
        @GetMapping("/getUserById")
        public String getUserById(Integer id){
            return userService.getUserById(id);
        }
        @GetMapping("/deleteUserById")
        public void deleteUserById(Integer id){
             userService.deleteUserById(id);
        }
    }

    5)在浏览器中进行测试,输入http://localhost:8080/getUserById

     

    对于这些前置、后置、环绕、异常、最终的增强在这里不做过多的介绍,不清楚的同学可以查一下Spring的相关知识。

  • 相关阅读:
    php网站请求返回结果被加入恶意代码片段
    php tp5 的index.php 被改成首页静态页面内容
    gitee https 方式每次都要输入密码的解决
    linux 下 php执行 exec 无反应 返回值为空
    layerconfirm 右上角关闭事件等于按钮2
    微信小程序公共方法创建与调用
    php curl 转为 x-www-form-urlencoded 方式
    php 加载 zip 文件
    小程序语音播报
    mysql命令行操作-将查询结果导出到文件
  • 原文地址:https://www.cnblogs.com/027kgc/p/12502244.html
Copyright © 2011-2022 走看看