Spring Boot中的切面AOP笔记

1. 什么是AOP?

AOP是OOP的延续,是Aspect Oriented Programming的缩bai写,意思du是面向切面编程。可以通过预zhi编译方式dao和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

2. 在Spring Boot中然后使用AOP

2.1先导入依赖

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

2.2 实现AOP切面

创建一个切面类 ,在该类上需要加入@Aspect和@Component注解:

package liz.com.springtest.handler;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
* @author linjiazeng
* @version 1.0
* @date 2020/12/21 14:00
**/
@Aspect
@Component
public class TestAspectHandler {

   /*
   1.@Pointcut:定义一个切面,即上面所描述的关注的某件事入口。
   2.@Before:在做某件事之前做的事。
   3.@After:在做某件事之后做的事。
   4.@AfterReturning:在做某件事之后,对其返回值做增强处理。
   5.@AfterThrowing:在做某件事抛出异常时,处理。
   * */
  // G:\代码\Springboot_Study\springtest\src\main\java\liz\com\springtest\controller
   @Pointcut("execution(* liz.com.springtest.controller..*.*(..))")
   public void pointCut1(){}

   //具体到某个方法的切面
   @Pointcut("execution(* liz.com.springtest.controller.AspectController.getAfter())")
   public void pointCut2(){}
   @Pointcut("execution(* liz.com.springtest.controller.AspectController.getAfterReturning())")
   public void pointCut3(){}

   @Pointcut("execution(* liz.com.springtest.controller..*.*(..))")
   public void pointCut4(){}
       /*
       * @Pointcut 注解指定一个切面,定义需要拦截的东西,这里介绍两个常用的表达式:
       * 一个是使用execution() ,另一个是使用 annotation() 。
       * 以 execution(* com.itcodai.course09.controller..*.*(..))) 表达式为例,
       * 语法如下:
       *   execution() 为表达式主体
           第一个 * 号的位置:表示返回值类型, * 表示所有类型
           包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,
           liz.com.contcroller 包、子包下所有类的方法
           第二个 * 号的位置:表示类名, * 表示所有类
           *(..) :这个星号表示方法名, * 表示所有的方法,后面括弧里面表示方法的参数,两个句点
           表示任何参数


           annotation() 方式是针对某个注解来定义切面,比如我们对具有 @GetMapping 注解的方法做切面,
           可以如下定义切面
           @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
           public void annotationCut() {}
       *
       * */

/*
@Before 注解指定的方法在切面切入目标方法之前执行,可以做一些 log 处理,也可以做一些信息的
统计,比如获取用户的请求 url 以及用户的 ip 地址等等,这个在做个人站点的时候都能用得到,都是常
用的方法。例如:
*/
   @Before("pointCut1()")
   public void doBefore(JoinPoint joinPoint){
       System.out.println("=======进入到doBefore方法========");
       //获取签名
       Signature signature = joinPoint.getSignature();
       //获取切入的包名
       String declaringTypeName = signature.getDeclaringTypeName();
       //获取即将执行的方法
       String funcName = signature.getName();
       System.out.println("即将执行的方法名为:"+funcName+"属于"+declaringTypeName);
       //在这里可以加入很多执行的方法


   }
/*@After 注解和 @Before 注解相对应,指定的方法在切面切入目标方法之后执行,也可以做一些完成
某方法之后的 log 处理。
c*/
   @After("pointCut2()")
   public void after(){
       System.out.println("==============进入After的执行方法===============");
       //这里可以加入很多的业务逻辑
   }

   /*需要注意的是:在 @AfterReturning 注解 中,属性 returning 的值必须要和参数保持一致,否则会
检测不到。该方法中的第二个入参就是被切方法的返回值,在 doAfterReturning 方法中可以对返回
值进行增强,可以根据业务需要做相应的封装。*/
   @AfterReturning(pointcut = "pointCut3()", returning = "result")
   public void AfterReturning (JoinPoint joinPoint,Object result){
       System.out.println("==============执行AfterReturning方法===============");

       System.out.println("加强的结果:"+result);

       //这里可以加入很多的业务逻辑

   }
   /*
   @AfterReturning 注解和 @After 有些类似,区别在于 @AfterReturning 注解可以用来捕获切入方
法执行完之后的返回值,对返回值进行业务逻辑上的增强处理,例如:
*/
   @AfterThrowing(pointcut = "pointCut4()",throwing = "ex")
   public void AfterThrowing(JoinPoint joinPoint,Exception ex){
       System.out.println("==============执行AfterThrowing方法===============");
       System.out.println(ex.getCause().toString());

   }

}
/*
需要注意的是:在 @AfterReturning 注解 中,属性 returning 的值必须要和参数保持一致,否则会
检测不到。该方法中的第二个入参就是被切方法的返回值,在 doAfterReturning 方法中可以对返回
值进行增强,可以根据业务需要做相应的封装。
*/

测试代码:

package liz.com.springtest.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author linjiazeng
 * @version 1.0
 * @date 2020/12/21 14:25
 **/
@RestController
@RequestMapping("aspect")
public class AspectController {

    @GetMapping("getBefore")
    public void getBefore(){
       System.out.println("getBefore方法执行");
    }
    @GetMapping("getAfter")
    public void getAfter(){
        System.out.println("getAfter方法执行");
    }
    @GetMapping("getAfterReturning")
    public String getAfterReturning(){

        return "hello getAfterReturning ";
    }

    @GetMapping("getAfterThrowing")
    public void getAfterThrowing(){
        int i = 1/0;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一些 Spring Boot 面试时可能会涉及的重要知识点和面试建议: 1. 什么是 Spring BootSpring BootSpring 框架的一个子项目,它基于 Spring 框架,简化了 Spring 应用的配置和开发过程,使得开发者可以更加便捷地创建独立、生产级别的 Spring 应用。Spring Boot 提供了自动化配置、开箱即用的组件和快速启动的能力,使得开发者可以更加专注于业务逻辑的实现。 2. Spring Boot 有哪些优点? - 简化了 Spring 应用的配置和开发过程。 - 集成了众多常用的第三方库,可以快速地搭建项目。 - 提供了自动化配置和开箱即用的组件,使得开发者可以更加专注于业务逻辑的实现。 - 与 Spring Framework 完美集成,可以很方便地使用 Spring 的各种功能。 - 支持多种开发方式,包括传统的 WAR 包部署、嵌入式服务器部署、Docker 容器化部署等。 3. Spring Boot 的核心注解有哪些? - @SpringBootApplication:用于标记 Spring Boot 应用的主类,它包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解,可以简化应用的配置和启动过程。 - @Controller、@Service、@Repository、@Component:用于标记 Spring Bean,可以自动扫描并注册到 Spring 容器。 - @Autowired、@Resource、@Inject:用于依赖注入,可以自动装配 Spring Bean。 4. Spring Boot 的配置文件有哪些? Spring Boot 支持多种配置文件格式,包括 properties、yml、json 等。其,application.properties 或 application.yml 是 Spring Boot 默认的配置文件,它可以放在项目的 classpath 下,也可以通过指定 spring.config.location 属性来指定配置文件的路径。 5. Spring Boot 的自动配置原理是什么? Spring Boot 的自动配置基于条件注解和条件判断,它会根据应用的上下文环境和 classpath 的依赖库来自动配置 Spring Bean。例如,当 classpath 存在 HikariCP 库时,Spring Boot 会自动配置一个 HikariCP 数据源,而不需要手动配置。 6. Spring Boot 如何处理异常? Spring Boot 提供了统一的异常处理机制,可以通过 @ControllerAdvice 和 @ExceptionHandler 注解来处理应用的异常。在异常处理类,可以通过 @ExceptionHandler 注解和方法参数来定义需要处理的异常类型和异常处理逻辑。 7. Spring Boot 如何实现 AOPSpring Boot 集成了 Spring Framework 的 AOP 功能,可以通过 @Aspect 和 @Around 注解来实现切面编程。在切面,可以定义需要拦截的方法和拦截逻辑,以实现日志记录、权限控制等功能。 8. Spring Boot 如何实现事务管理? Spring Boot 集成了 Spring Framework 的事务管理功能,可以通过 @Transactional 注解来实现事务控制。在需要进行事务控制的方法上添加 @Transactional 注解,即可开启事务。 9. Spring Boot 如何集成数据库? Spring Boot 支持多种数据库,包括 MySQL、Oracle、MongoDB 等,可以通过在 pom.xml 添加相应的依赖库来实现数据库的集成。同时,Spring Boot 也提供了多种数据库访问方式,包括 JDBC、JPA、MyBatis 等,可以根据实际需求选择合适的方式。 10. Spring Boot 如何实现缓存? Spring Boot 集成了多种缓存框架,包括 Ehcache、Redis、Caffeine 等,可以通过在 pom.xml 添加相应的依赖库来实现缓存功能。同时,Spring Boot 也提供了多种缓存注解,包括 @Cacheable、@CachePut、@CacheEvict 等,可以方便地实现缓存功能。 面试建议: - 对于 Spring Boot 的基本原理和使用方法要有深入了解,并能够熟练使用 Spring Boot 搭建项目。 - 对于 Spring Boot 常用的注解和配置文件要熟练掌握。 - 对于 Spring Boot 的高级功能(如自动配置、AOP、事务管理、缓存等)要有一定的了解,并能够根据实际需求进行应用。 - 在面试要注意表达清楚自己的观点和思路,可以通过实际项目经验来证明自己的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值