热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Spring中基于XML的AOP配置详解

这篇文章主要介绍了Spring中基于XML的AOP配置,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1. 准备工作

1.1 创建工程 day03_eesy_03SpringAOP

1.2 在配置文件pom.xml中添加依赖

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 4.0.0

 com.itheima
 day03_eesy_03springAOP
 1.0-SNAPSHOT

 jar

 
 
  org.springframework
  spring-context
  5.2.4.RELEASE
 

 
  org.aspectj
  aspectjweaver
  1.9.5
 
 

说明: aspect依赖是用来声明切入点坐标的

1.3 编写业务层代码

1.创建包 service

2.创建业务层接口IAccountService.java

/**
 * 账户的业务层接口
 */
public interface IAccountService {

 /**
 * 模拟保存账户
 */
 void saveAccount();

 /**
 * 模拟更新账户
 */
 void updateAccount(Integer i);
 /**
 * 模拟删除账户
 */
 int deleteAccount();
}

3.创建业务层实现类AccountServiceImpl.java

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl implements IAccountService {
 public void saveAccount() {
 System.out.println("执行了保存");
 }

 public void updateAccount(Integer i) {
 System.out.println("执行力更新");
 }

 public int deleteAccount() {
 System.out.println("执行了删除");
 return 0;
 }
}

4.创建日志类

&#8203; 该类为用于记录日志的工具类,它里面提供了公共的代码(通知)

Logger.java

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {

 /**
 * 用于打印日志,计划让其在切入点方法执行之前执行(切入点方法就是业务层方法)
 */
 public void printLog(){
 System.out.println("Logger类中的printLog方法开始记录日志了");
 }
}

2. 进行配置

创建配置文件 bean.xml

先添加包含AOP的约束,后添加配置

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 

 

 
 

 
 
 
 
  
  
 
 

说明: 切入点表达式最好按软件的提示写,自己直接手写在测试时容易报错

3. 创建测试类AOPTest.java

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
 //1.获取容器
 ApplicationContext applicatiOnContext= new ClassPathXmlApplicationContext("bean.xml");
 //2.获取对象
 IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
 accountService.saveAccount();
 }
}

4. 运行结果

5. 目录结构

6. 切入点表达式写法补充

6.1 介绍


6.2 在bean.xml中表示

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 

 

 
 

 
 
 
 
  
  
 
 

6.3 在测试类AOPTest.java中测试

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
 //1.获取容器
 ApplicationContext applicatiOnContext= new ClassPathXmlApplicationContext("bean.xml");
 //2.获取对象
 IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
 accountService.saveAccount();
 accountService.updateAccount(1);
 accountService.deleteAccount();
 }
}

6.4 运行结果

7. 四种通知类型补充

 7.1 在Logger.java类中添加方法

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {

 /**
 * 前置通知
 */
 public void beforePrintLog(){
 System.out.println("前置通知:Logger类中的printLog方法开始记录日志了");
 }

 /**
 * 后置通知
 */
 public void afterReturningPrintLog(){
 System.out.println("后置通知:Logger类中的printLog方法开始记录日志了");
 }
 /**
 * 异常通知
 */
 public void afterThrowingPrintLog(){
 System.out.println("异常通知:Logger类中的printLog方法开始记录日志了");
 }
 /**
 * 最终通知
 */
 public void afterPrintLog(){
 System.out.println("最终通知:Logger类中的printLog方法开始记录日志了");
 }
}

7.2 在bean.xml中进行配置

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 


 
 

 
 
 
 
  
  

  
  

  
  

  
  
 
 

7.3 在测试类AOPTest.java中运行

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
 //1.获取容器
 ApplicationContext applicatiOnContext= new ClassPathXmlApplicationContext("bean.xml");
 //2.获取对象
 IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
 accountService.saveAccount();

 }
}

7.4 运行结果

8. 通用化切入点表达式

用于解决在bean.xml文件中配置通知时多次写切入点表达式的问题

使用 aop:pointcut标签,在bean.xml中进行配置

8.1 在aop:aspect标签内部使用aop:pointcut

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 


 
 

 
 
 
 
  
  

  
  

  
  

  
  


  
  
 
 

运行结果:

此时,aop:pointcut定义的切入点表达式只能在当前切面中使用

8.2 在aop:aspect标签外部使用aop:pointcut

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 


 
 

 
 

 
 
 
 
 
  
  

  
  

  
  

  
  
 
 

运行结果:

此时所有的切面都能使用该aop:pointcut定义的切入点表达式

主要: 当在aop:aspect标签外部使用aop:pointcut标签定义切入点表达式的时候,由于使用的约束的规定, aop:pointcut标签只能在 aop:aspect标签上方

9. Spring的环绕通知

9.1 在Logger.java中添加实现环绕通知的方法 aroundPringLog

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {
 /**
 * 环绕通知
 *
 */
 public void aroundPringLog(){
  System.out.println("Logger类中的aroundPringLog方法开始记录日志了");
 }

}

9.2 在bean.xml中完成配置

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 
 


 
 

 
 
 
 

 
 
  
  
 
 

9.3 此时运行结果

9.4 问题分析

此时只执行了通知方法,而切入点方法没有执行

原因:

&#8203; 通过对比动态的代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而本案例中的代码没有

9.5 完善aroundPringLog方法

Logger.java

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {
 /**
 * 环绕通知
 * 问题:
 * 当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
 * 分析:
 * 通过对比动态的代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而我们的代码中没有
 * 解决:
 * Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法
 * 该接口可以作为环绕通知的方法参数, 在程序执行的时候,Spring框架会为我们提供该接口供我们使用
 *
 * Spring的环绕通知:
 * 他是Spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式
 */
 public Object aroundPringLog(ProceedingJoinPoint proceedingJoinPoint){

 Object returnValue = null;
 try {

  Object[] args = proceedingJoinPoint.getArgs(); //得到方法执行所需要的参数

  System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----前置");

  returnValue = proceedingJoinPoint.proceed(args); //明确调用业务层方法,切入点方法

  System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----后置");

  return returnValue;
 }catch (Throwable throwable){
  System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----异常");
  throw new RuntimeException(throwable);
 }finally {
  System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----最终");
 }
 }

}

9.6 运行结果

9.7 目录结构

到此这篇关于Spring中基于XML的AOP配置的文章就介绍到这了,更多相关Sprin AOP配置内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 标题: ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • docker增加restart=always, docker重启后自动启动容器的方法
    本文介绍了在运行docker容器时如何添加参数来保证每次docker服务重启后容器也自动重启的方法,以及如何使用命令来更新已启动的容器。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
author-avatar
祢好世界末日
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有