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

Spring中基于xml的AOP的详细步骤

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

1、Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术。Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容。是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率。简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进行增强,(使用动态代理的方式实现)

相关术语

JoinPoint:链接点 那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

Pointcut:切入点 是指我们要对哪些JoinPont进行拦截的定义

Advice:通知/增强 拦截到Joinpoint之后所要做的事情就是通知

通知类型:前置通知、后置通知、异常通知、最终通知、环绕通知

Introduction:引介 是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或field

Target:目标对象,代理的目标对象

Weaving织入 是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

Proxy:代理,一类类被Aop织入增强后,就产生一个结果代理类

Aspect:切面 是切入点和通知(引介)的结合

在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

基于XMl的AOP步骤

1、创建Maven项目引入spring坐标

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

 4.0.0
 com.mingqi
 SpringIOC
 pom
 1.0-SNAPSHOT
 
 
  org.springframework
  spring-context
  5.0.2.RELEASE
 
 
  org.aspectj
  aspectjweaver
  1.8.7
 
 
  junit
  junit
  4.12
  test
 
 

2、创建业务层接口:

package com.mingqi.services;
public interface IAccountService {
 /**
 * 模拟登陆账户
 */
 void saveAccount();

 /**
 * 模拟更新账户
 * @param id
 */
 void updateAccount(int id);

 /**
 * 模拟删除账户
 * @return
 */
 int deleteAccount();

}

3.创建业务层实现类

package com.mingqi.services.impl;
import com.mingqi.services.IAccountService;
public class AccountServicesImpl implements IAccountService {
 public void saveAccount() {
 System.out.println("执行了保存");
 }

 public void updateAccount(int id) {
 System.out.println("执行了更新"+id);
 }

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

4、创建工具类

package com.mingqi.utils;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 用户记录日志的工具类,里面提供公共的代码
 */
public class Logger {
 /**
 * 用于打印日志:计划让其在切入点方法执行前执行(切入点方法就是业务层方法)
 */
 public void beforePrintLog(){
 System.out.println("Logger类中的pringLog方法开始记录日志了。。。");
 }
 public void afterReturningPrintLog()
 {
 System.out.println("后置通知Logger类中的beforePrintLog方法开始记录日志了。。。");
 }
 /**
 * 异常通知
 */
 public void afterThrowingPrintLog()
 {
 System.out.println("异常通知Logger类中的afterThrowingPrintLog方法开始记录日志了。。。");

 }
 /**
 * 最终通知
 */
 public void afterPrintLog()
 {
 System.out.println("最终通知Logger类中的afterPrintLog方法开始记录日志了。。。");
 }

 /**
 * 环绕通知
 * 问题 当我们配置了环绕通知以后,切入点方法没有执行,而通知方法执行了
 * 分析: 通过对比动态代理中的环绕通知代码,发现动态代理中的环绕通知有明确的切入点方法调用,而我们的代码中没有
 * 解决: Spring 框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点的方法
 * 该接口可以作为环绕通知的参数方法,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用
 * spring中的环绕通知
 * 他是spring框架为我们提供的一种可以在代码中手动控制增强方法何时会执行的方式
 * @param pjp
 * @return
 */
 public Object aroundPringLog(ProceedingJoinPoint pjp){
 Object rtValue = null;
 try{
  Object[] args = pjp.getArgs();//得到方法执行所需的参数

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

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

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

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

5、创建bean配置文件

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

 
 
 
 
 
 
 
  
  
  
   

   
   
   
   
   
   
  
 

6、创建测试类

package com.mingqi.test;
import com.mingqi.services.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringIoc {
 @Test
 public void TestAccount()
 {
 ApplicationContext ac= new ClassPathXmlApplicationContext("beam.xml");
 IAccountService accountService=(IAccountService) ac.getBean("accountSevice");
 accountService.saveAccount();
 accountService.updateAccount(22);
 accountService.deleteAccount();
 }
}

总结

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


推荐阅读
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 小编给大家分享一下如何移除URL中的index.php,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收 ... [详细]
  • 本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
author-avatar
mobiledu2502913921
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有