全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Spring Aop实例之xml配置

AOP的配置方式有2种方式:xml配置和AspectJ注解方式。今天我们就来实践一下xml配置方式。

我采用的jdk代理,所以首先将接口和实现类代码附上

package com.tgb.aop; 
public interface UserManager { 
 
  public String findUserById(int userId); 
} 
 
 
package com.tgb.aop; 
 
public class UserManagerImpl implements UserManager { 
 
  public String findUserById(int userId) { 
    System.out.println("---------UserManagerImpl.findUserById()--------"); 
    if (userId <= 0) { 
      throw new IllegalArgumentException("该用户不存在!");  
    } 
    return "张三"; 
  } 
}

单独写一个Advice通知类进行测试。这个通知类可以换成安全性检测、日志管理等等。

package com.tgb.aop; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.ProceedingJoinPoint; 
 /** 
 * Advice通知类 
 * 测试after,before,around,throwing,returning Advice. 
 * @author Admin 
 * 
 */ 
public class XMLAdvice { 
 
  /** 
   * 在核心业务执行前执行,不能阻止核心业务的调用。 
   * @param joinPoint 
   */ 
  private void doBefore(JoinPoint joinPoint) { 
    System.out.println("-----doBefore().invoke-----"); 
    System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等"); 
    System.out.println(" 可通过joinPoint来获取所需要的内容"); 
    System.out.println("-----End of doBefore()------"); 
  } 
   
  /** 
   * 手动控制调用核心业务逻辑,以及调用前和调用后的处理, 
   * 
   * 注意:当核心业务抛异常后,立即退出,转向After Advice 
   * 执行完毕After Advice,再转到Throwing Advice 
   * @param pjp 
   * @return 
   * @throws Throwable 
   */ 
  private Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
    System.out.println("-----doAround().invoke-----"); 
    System.out.println(" 此处可以做类似于Before Advice的事情"); 
     
    //调用核心逻辑 
    Object retVal = pjp.proceed(); 
     
    System.out.println(" 此处可以做类似于After Advice的事情"); 
    System.out.println("-----End of doAround()------"); 
    return retVal; 
  } 
 
  /** 
   * 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice 
   * @param joinPoint 
   */ 
  private void doAfter(JoinPoint joinPoint) { 
    System.out.println("-----doAfter().invoke-----"); 
    System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等"); 
    System.out.println(" 可通过joinPoint来获取所需要的内容"); 
    System.out.println("-----End of doAfter()------"); 
  } 
   
  /** 
   * 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice 
   * @param joinPoint 
   */ 
  private void doReturn(JoinPoint joinPoint) { 
    System.out.println("-----doReturn().invoke-----"); 
    System.out.println(" 此处可以对返回值做进一步处理"); 
    System.out.println(" 可通过joinPoint来获取所需要的内容"); 
    System.out.println("-----End of doReturn()------"); 
  } 
   
  /** 
   * 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息 
   * @param joinPoint 
   * @param ex 
   */ 
  private void doThrowing(JoinPoint joinPoint,Throwable ex) { 
    System.out.println("-----doThrowing().invoke-----"); 
    System.out.println(" 错误信息:"+ex.getMessage()); 
    System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等"); 
    System.out.println(" 可通过joinPoint来获取所需要的内容"); 
    System.out.println("-----End of doThrowing()------"); 
  } 
} 

只有Advice还不行,还需要在application-config.xml中进行配置:

<?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:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 
        
   
  <bean id="userManager" class="com.tgb.aop.UserManagerImpl"/> 
   
  <!--<bean id="aspcejHandler" class="com.tgb.aop.AspceJAdvice"/>--> 
  <bean id="xmlHandler" class="com.tgb.aop.XMLAdvice" /> 
  <aop:config> 
    <aop:aspect id="aspect" ref="xmlHandler"> 
      <aop:pointcut id="pointUserMgr" expression="execution(* com.tgb.aop.*.find*(..))"/>        
      <aop:before method="doBefore" pointcut-ref="pointUserMgr"/> 
      <aop:after method="doAfter" pointcut-ref="pointUserMgr"/> 
      <aop:around method="doAround" pointcut-ref="pointUserMgr"/> 
      <aop:after-returning method="doReturn" pointcut-ref="pointUserMgr"/> 
      <aop:after-throwing method="doThrowing" throwing="ex" pointcut-ref="pointUserMgr"/>        
    </aop:aspect> 
  </aop:config> 
</beans> 

编一个客户端类进行测试一下:

package com.tgb.aop;  
import org.springframework.beans.factory.BeanFactory; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
public class Client { 
 
  public static void main(String[] args) { 
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    UserManager userManager = (UserManager)factory.getBean("userManager"); 
     
    //可以查找张三 
    userManager.findUserById(1); 
     
    System.out.println("=====我==是==分==割==线====="); 
 
    try { 
      // 查不到数据,会抛异常,异常会被AfterThrowingAdvice捕获 
      userManager.findUserById(0); 
    } catch (IllegalArgumentException e) { 
    } 
  } 
} 

结果如图:

值得注意的是Around与Before和After的执行顺序。3者的执行顺序取决于在xml中的配置顺序。图中标记了3块,分别对应Before,Around,After。其中②中包含有③。这是因为aop:after配置到了aop:around的前面,如果2者调换一下位置,这三块就会分开独立显示。如果配置顺序是aop:after  -> aop:around ->aop:before,那么①和③都会包含在②中。这种情况的产生是由于Around的特殊性,它可以做类似于Before和After的操作。当安全性的判断不通过时,可以阻止核心业务逻辑的调用,这是Before做不到的。

  

 

使用xml可以对aop进行集中配置。很方便而简单。可以对所有的aop进行配置,当然也可以分开到单独的xml中进行配置。当需求变动时,不用修改代码,只要重新配置aop,就可以完成修改操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # aop  # xml配置  # spring4  # xml  # Spring基于XML配置AOP详解  # Java_Spring之XML 的 AOP 配置  # Spring中基于XML的AOP配置详解  # Spring boot AOP通过XML配置文件声明的方法  # spring中aop的xml配置方法实例详解  # Spring使用AspectJ注解和XML配置实现AOP  # Spring 使用xml配置AOP的过程详解  # 可通过  # 所需要  # 类似于  # 以对  # 错误信息  # 返回值  # 的是  # 这是  # 就会  # 要在  # 转到  # 不存在  # 这种情况  # 它可以  # 如图  # 就来  # 这是因为  # 该用户  # 开到  # 很方便 


相关文章: 如何在Windows 2008云服务器安全搭建网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  制作网站的模板软件,网站怎么建设?  广州建站公司哪家好?十大优质服务商推荐  建站之星如何实现五合一智能建站与营销推广?  建站之星收费标准详解:套餐费用及年费价格表一览  如何通过宝塔面板实现本地网站访问?  建站之星代理商如何保障技术支持与售后服务?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何自定义建站之星网站的导航菜单样式?  Swift中循环语句中的转移语句 break 和 continue  开心动漫网站制作软件下载,十分开心动画为何停播?  如何在腾讯云服务器上快速搭建个人网站?  如何在阿里云通过域名搭建网站?  太原网站制作公司有哪些,网约车营运证查询官网?  建站主机如何安装配置?新手必看操作指南  如何在阿里云高效完成企业建站全流程?  如何快速搭建高效香港服务器网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何选择香港主机高效搭建外贸独立站?  如何批量查询域名的建站时间记录?  建站之星伪静态规则如何正确配置?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何挑选最适合建站的高性能VPS主机?  如何挑选高效建站主机与优质域名?  香港服务器WordPress建站指南:SEO优化与高效部署策略  定制建站策划方案_专业建站与网站建设方案一站式指南  Python多线程使用规范_线程安全解析【教程】  北京专业网站制作设计师招聘,北京白云观官方网站?  如何选择建站程序?包含哪些必备功能与类型?  高端网站建设与定制开发一站式解决方案 中企动力  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  制作农业网站的软件,比较好的农业网站推荐一下?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  中山网站推广排名,中山信息港登录入口?  网站制作公司排行榜,抖音怎样做个人官方网站  如何访问已购建站主机并解决登录问题?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  如何用VPS主机快速搭建个人网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  建站之星如何快速更换网站模板?  建站主机是否等同于虚拟主机?  利用JavaScript实现拖拽改变元素大小  香港服务器租用每月最低只需15元?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  高防服务器如何保障网站安全无虞?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。