第五章 Spring进阶-注解方式实现AOP(1)

简介:
徒弟: 师傅,我以前:
使用JDK中的Proxy技术实现AOP功能
使用CGLIB实现AOP功能
使用编程式创建AOP代理
非常繁琐,本来好好的一天的时间,我可以快快乐乐乐完成了某个业务流程,很有成就感,却被这些繁琐的实现方式,毁了我美好的一天,有没有办法救救我呀,有的话,请你吃饭!
师傅: 这么好的差事,还有饭吃 (心里想着毛家、周边的餐馆 ,真爽) ,当然要教!
补充:
个人认为:工作的时候,我们应该更加关注业务逻辑的实现,一些繁琐的使用方式,应该成为茶余饭后研究的乐趣。
要进行AOP编程,首先我们要在配置文件中引入aop命名空间;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
</beans>
Spring提供了两种切面使用方式,可以根据实际工作情况,选用其中一种:
1、  基于XML配置方式进行AOP开发
2、  基于注解方式进行AOP开发
为了更快地完成配置,将焦点转移到业务逻辑中,我选择了第二种(其实是为了更快地把吃饭的事情确定下来)
     既然讲到配置文件,就先将aop的配置开关打开吧,配置文件中加入:
<aop:aspectj-autoproxy/>
哎呀,太着急了,还得 加入两个包:
lib/aspectj/aspectjweaver.jar
lib/aspectj/aspectjrt.jar
     新增加一个类:
/**
 * Book切面
 */
@Aspect
public   class  BookInterceptor {
  @Pointcut ( "execution (* com.netease.lee.service..*.*(..))" )
  private   void   anyMethod()  {
    // System.out.println("anyMethod");
  } // 声明一个切入点
  /*
   * 首先拦截所有方法的执行 然后在方法之前,执行前置通知,
   * 执行完前置通知之后,才会执行被拦截到的方法。
   * 切入点的名称,附加条件:要求有String类型的参数
   * 即这里只拦截saveBook(String bookName)方法
   */
  @Before ( "anyMethod() && args(bookName)" )
  public   void  doBefore(String bookName) {
    System. out .println( "前置通知:"  + bookName);
  }
  @AfterReturning (pointcut =  "anyMethod()" , returning =  "result" )
  public   void  doAfterReturning(String result) {
    System. out .println( "后置通知:"  + result);
  }
  @After ( "anyMethod()" )
  public   void  doAfter() {
    System. out .println( "最终通知" );
  }
  @AfterThrowing (pointcut =  "anyMethod()" , throwing =  "e" )
  public   void  doAfterThrowing(Exception e) {
    System. out .println( "例外通知:"  + e);
  }
  //环绕通知可以替代前面的任何通知
  @Around ( "anyMethod()" )
  public  Object doAround(ProceedingJoinPoint pjp) 
throws  Throwable {
    System. out .println( " 环绕通知 进入方法" );
    Object result = pjp.proceed();
    System. out .println( " 环绕通知 退出方法" );
    return  result;
  }
}
@Pointcut ( "execution (* com.netease.lee.service..*.*(..))" )
第一个 * 代表任何的返回值类型 com.netease.lee.service 是包名。
.. 两点,说明对子包里面的类也要拦截。
*.* 说明:第一个*代表所有类,第二个*代表所有方法。
(..) 说明:括号里面的两点,代表方法的参数,这里代表随意。
@Before ( "anyMethod() && args(name)" )
前置通知,填入的是切入点的名称。
附上代码:
@Service ( "bookService" )
public   class  BookServiceImpl  implements  BookService {
  @Resource
  private  BookDAO  bookDAO ;
  public   void  listBook() {
    bookDAO .listBook();
  }
  @Override
  public  String getBookName(Integer bookId) {
    return   bookDAO .getBookName(bookId);
  }
  @Override
  public   void  saveBook(String bookName) {
    bookDAO .saveBook(bookName);
  }
  @Override
  public   void  updateBoook(String bookName, Integer bookId) {
    bookDAO .updateBook(bookName, bookId);
  }
}
    运行结果这里就不演示了,赶着去吃饭了!徒弟说不行,这样子的话,如果他写了几十个切面类,别人过来看,岂不是不能“纵观全局”,有没有好办法,一看就知道项目里面配置了哪些切面类,定义了什么?
 
    由于篇幅问题,请看:第五章 Spring进阶-注解方式实现AOP(2)
关注我的微博,请使用网易通行证,通过邀请链接登陆,就可以直接关注我。
相关文章
|
6月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
653 0
|
5月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
7月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
7月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
8月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1205 0
|
9月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
986 0
|
5月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
492 4
|
5月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1036 3
|
12月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
490 0