SpringBoot入门(十三)

简介: SpringBoot入门(十三)

SpringBoot-AOP

Aop:面向切面的一种编程

1、加入starter-aop的依赖:

  1.        <dependency>
  2.            <groupId>org.springframework.boot</groupId>
  3.            <artifactId>spring-boot-starter-aop</artifactId>
  4.        </dependency>

2、写一个UserDaoImpll类:代码如下:

  1.      package com.boot.aop.bootaop;
  2.      import org.springframework.stereotype.Repository;
  3.      @Repository
  4.      public class BookDaoImpl {
  5.        public  void  addBook(String name,String author){
  6.        System.out.println("bookName:"+name+",bookAuthor:"+author);
  7.    }
  8. }

3、想要在这个addBook方法的前后去切入的话,想要在这个方法addBook的前后做一个增强的话:

3.1、写一个切面的Aop类:BookAop,代码如下:

  1. package com.boot.aop.bootaop.aop;
  2. import org.aspectj.lang.annotation.After;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Before;
  5. import org.springframework.stereotype.Component;
  6. //在运行期间如果发现这个aop找到了切入点的话就会在BookDaoImpl中的方法
  7. //自动的在方法的前后切入进行增强
  8. @Component
  9. @Aspect
  10. public class BookAop {
  11.    //定义切入点,第一个星代表所有的返回类型
  12.    //. .代表包及其子包
  13.    //第二个星代表所有的类中的
  14.    //第三这个星代表所有的方法
  15.    //(..)代表参数不受限制。
  16.    public static final String POINT_CUT="execution(* com.boot.aop.bootaop.dao..*.*(..))";
  17.    @Before(POINT_CUT)
  18.    public void  before(){
  19.        System.out.println("添加图书方法校验前");
  20.    }
  21.    @After(POINT_CUT)
  22.    public void  after(){
  23.        System.out.println("添加图书成功后");
  24.    }
  25. }

然后主函数如下:

  1. package com.boot.aop.bootaop;
  2. import com.boot.aop.bootaop.dao.BookDaoImpl;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. @SpringBootApplication
  7. public class BootAopApplication {
  8.    public static void main(String[] args) {
  9.        ConfigurableApplicationContext context = SpringApplication.run(BootAopApplication.class, args);
  10.        BookDaoImpl bookDao = context.getBean(BookDaoImpl.class);
  11.        bookDao.addBook("三国演义","罗贯中");
  12.    }
  13. }

运行的结果如下:这就是在addBook方法的前后做了一个增强。这就是面向切面的一个编程。目标类是BookDaoImpl。

可以通过JoinPoint对象获取一些属性的值,代码如下:

  1.    @After(POINT_CUT)
  2.    public void  after(JoinPoint jp){
  3.        System.out.println(jp.getTarget().getClass());
  4.        System.out.println(Arrays.asList(jp.getArgs()));
  5.        System.out.println("添加图书成功后");
  6.    }

运行的结果如下:获取的是目标类和参数的值。

既然SpringBoot集成了aop,可以通过配置来配置Aop。

1、基于Spring的Aop写法:

spring.aop.auto=true:是否启用aop

spring.aop.proxy-target-class=false:代理方式有接口使用jdk动态代理,如果没有接口使用cglib代理,默认的值为false。

代码如下:

  1.  spring.aop.auto=true
  2.  spring.aop.proxy-target-class=false

主函数里加上一行代码,来获取接口的类型;

  1. System.out.println(bookDao.getClass());

运行的结果如下:当一个没有实现接口的类交给Spring容器做Aop做代理的话,是cglib代理。

如果是实现接口的类的话就是jdk的动态代理,代码如下:

但是如果一个类去实现接口的话也可以强制使用cglib的代理,配置如下:

下面的配置改为true即可。

再次运行下:

这两个代理的区别:jdk的动态代理只能代理接口,而cglib的代理有无接口都可以代理。

在Spring如果使用这个类的jdk动态代理的话,不能用他的实现类来获取的。

如果有多个类实现接口的话需要加一个别名的参数。

2、基于SpringBoot的做法:@EnableAutoProxyClass

exposeProxy属性表示如果使用true就可以使用AopContext对象获取当前代理对象,false则不能使用

proxyTargetClass:true表示使用cglib的动态代理,false表示使用jdk代理。

代码如下:

运行的结果如下:

总结:

相关文章
|
10月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
525 6
|
Java Apache Scala
【阿里云镜像】配置阿里云Maven 镜像
【阿里云镜像】配置阿里云Maven 镜像
25575 1
【阿里云镜像】配置阿里云Maven 镜像
|
8月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1012 0
|
12月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
822 5
|
Java 编译器
通义灵码的使用体验
作为一名Java开发工程师,我使用通义灵码辅助开发,通过IDEA插件实现便捷的问题检索与解决,显著提升开发效率。该插件还提供代码解释、生成优化建议等实用功能,助力高效编程。
|
数据采集 前端开发 Java
@ControllerAdvice:你可以没用过,但是不能不了解
`@ControllerAdvice` 是 Spring MVC 中用于定义全局行为的注解,如异常处理、数据绑定和预处理。它从 `@Component` 派生,确保被扫描并纳入容器。`@ExceptionHandler` 用于全局异常处理,提供统一的错误响应。例如,当处理不当的异常时,它能返回友好的错误信息。`@InitBinder` 在数据绑定前对参数进行处理,如格式转换。`@ModelAttribute` 可以用于全局绑定模型属性,如登录用户信息。Spring MVC 通过 `DispatcherServlet` 和 `HandlerAdapter` 在请求处理流程中应用这些全局配置。
638 3
@ControllerAdvice:你可以没用过,但是不能不了解
|
Java fastjson
springboot切面编程基础实践
springboot切面编程基础实践
165 0
|
缓存 监控 安全
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
843 1
|
存储 Java API
Spring Boot中的数据脱敏处理
Spring Boot中的数据脱敏处理
|
SQL Java 关系型数据库
java 递归返回树形组织结构(附带树形菜单的搜索)
java 递归返回树形组织结构(附带树形菜单的搜索)
430 0