和Spring1.X相比,Spring2.X使用AspectJ的语法来声明AOP,这使得它更“标准”,更灵活了。还是那句话,如果你不了解AspectJ并且打算使用Spring2.X的AspectJ式AOP,那就学学AspectJ吧,这方面的书还是很多了。

  Spring2.X下的切面有两种实现方式,一种是以Java文件定义切面(其只是普通的Java类),然后在配置文件中声明定义的切面;另一种是在Java类中引入和AOP相关的元数据(注释)。

  先介绍第一种配置方式。需要指出的是,Spring2.X的beans名称空间和Spring1.X有所不同,它采用了Schema而不是DTD(也可采用DTD方式,具体的请参考文档)。还是引入毫无意义的日志切面,定义的切面类LogingAspect 如下:

public class LogingAspect {
 public void logMethod(JoinPoint jp){
  System.err.println(jp.getTarget().getClass());
  System.err.println(jp.getSignature().getName());
 }
}

  同时在配置文件中如下配置:

<bean id = " logAspectTarget " class = " hibernatesample.service.util.LogingAspect ">
</ bean>
<aop:config>
<aop:aspect id = " logAspect " ref = " logAspectTarget ">
<aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
<aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect>
</ aop:config>

   对于上面的切面,切入点businessService是在配置文件中声明的,其表达式采用了 AspectJ的语法,LogingAspect 类中logMethod(JoinPoint jp)方法根据配置文件信息可知其是after通知,方法的JoinPoint参数不是必须的,它是来自于AspectJ的实用类,这里用它不过输出一些 和连接点有关的信息。当然,在Spring2.X中,切入点和通知能更灵活的使用,我们可以如AspectJ一样传递参数给通知。如果需要在 Service中引入事务功能,需要如下配置事务通知:

<tx:advice id = " txAdvice " transaction - manager = " transactionManager ">
<tx:attributes>
<tx:method name = " get* " read - only = " true " />
<tx:method name = " find* " read - only = " true " />
<tx:method name = " * " />
</ tx:attributes>
</ tx:advice>
<aop:config>
<aop:pointcut id = " demoServiceMethods " expression = " execution(* hibernatesample.service.*.*(..)) " />
<aop:advisor advice - ref = " txAdvice " pointcut - ref = " demoServiceMethods " />
<aop:aspect id = " logAspect " ref = " logAspectTarget ">
<aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
<aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect>
</ aop:config>

  完成上面的工作相当于完成了 Spring1.X 的 自动代理。 我们接下来需要定义的任何 Service Bean 都可以很纯粹很纯粹了:

<bean id ="accountService" class ="hibernatesample.service.impl.AccountServiceImpl">
<property name ="accountDAO" ref ="accountDAO"></ property>
</ bean>

  第二种实现 AOP 的方式和第一种相比,只是在 LogingAspect 中加入了注释,而省去了配置文件中和 LogingAspect 相关的配置。重新编写的 LogingAspect 如下:

@Aspect

public class LogingAspect {
@Pointcut( " execution(* hibernatesample.service.*.*(..)) " )
public void businessService(){}
@After( " businessService() " )
public void logMethod(JoinPoint jp){
 System.err.println(jp.getTarget().getClass());
 System.err.println(jp.getSignature().getName());
}
}

  而简化后的配置文件可以去除上面的如下和 logAspect 相关的配置信息:

<aop:aspect id ="logAspect" ref ="logAspectTarget">
<aop:pointcut id ="businessService" expression ="execution(* hibernatesample.service.*.*(..))" />
<aop:after pointcut-ref ="businessService" method ="logMethod" />
</ aop:aspect>
<bean id ="logAspectTarget" class ="hibernatesample.service.util.LogingAspect"></ bean>

  还没有完,为了使 Spring 应用 LogingAspect 的注释,需要在配置文件中添上

<aop:aspectj-autoproxy/>

  如果觉得事务的配置没有使用注释更简洁(我倒不会有这样的想法,毕竟在配置文件中声明的事务只是那么固定的几段,除非作用于类上的事务逻辑上很复杂),也可以使用Spring提供的事务注释作用于类文件上,这可是更细粒度的事务声明了。

--转载至程式先锋网站[url]www.javabiz.cn[/url]

转载于:https://blog.51cto.com/gongqikui/78928

Spring 2.X 中AOP的简明教程相关推荐

  1. 【干货】深度学习中的线性代数---简明教程

    作者 | Vihar Kurama 编译 | 专知 整理 | Mandy 线性代数对于理解机器学习和深度学习内部原理至关重要,线性代数是有关连续值的数学.许多计算机科学家在此方面经验不足,传统上计算机 ...

  2. 怎么html中加样式,简明教程 在HTML中添加样式表的方法

    CSS语句内嵌到HTML文档内的方法有四种. 1.最直接的方法是将CSS样式语句直接写在HTML的标识符(tag)里: <Tag style="properties"> ...

  3. html文档中strokestyle,HTML5简明教程-1.1.2.HTML5Canvas参考手册 之 笔触strokeStyle

    今天介绍canvas的另一个重要属性strokeStyle,strokeStyle属性定义了我们在canvas画布上进行图形绘制时的"笔触",简单点说,就是定义了我们的画笔样式.另 ...

  4. CoreMotion框架中加速度计使用简明教程

    前言 之前有人通过iPhone的加速度计做出一个手机防盗APP,而且正是通过这个防盗APP拿到天使投资.从此以后华丽转身,公司发展的有声有色.虽然这个项目最后不怎么样,但是,确实是一个不错的想法. 也 ...

  5. spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  6. Spring中AOP实现

    1.什么是SpringAOP 什么是aop:Aspect Oriented Programming的缩写,面向切面编程,通过预编译和动态代理实现程序功能的 统一维护的一种技术 主要功能:日志记录,性能 ...

  7. CentOs6.5中安装和配置vsftp简明教程

    这篇文章主要介绍了CentOs6.5中安装和配置vsftp简明教程,需要的朋友可以参考下 一.vsftp安装篇 复制代码代码如下: # 安装vsftpd yum -y install vsftpd # ...

  8. spring中aop事务

    文章目录 事务 为什要用到Spring中AOP事务 事物的特性 ACID 事务并发问题 事务的隔离级别 spring事务管理 事务操作 事务操作对象 spring管理事务的属性介绍 spring管理事 ...

  9. java获取keyvault_教程:在 Java Spring Boot 应用中使用 Azure 应用程序配置 Key Vault 引用 | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 教程:在 Java S ...

最新文章

  1. 图像处理学习三(频域图像增强)
  2. 英国拟在其国内建立一套互联网过滤网
  3. Tomcat+Apache 负载均衡
  4. 【SDK接入篇】【1】Unity的internal 与 gradle打包
  5. Laravel 多用户认证
  6. 解决 service、killall 等命令找不到的问题
  7. C语言家谱管理程序,c语言的家谱——interesting~
  8. mysql 查询一个数据库里面有多少张数据表
  9. 【渝粤教育】广东开放大学 普通话训练 形成性考核 (48)
  10. 多年前,初始架构:php+mysql下,对网站架构方面的一些认识
  11. 板簧的弹性系数如何计算_滑板式钢板弹簧悬架变刚度计算方法的研究
  12. 美国白宫《国家人工智能研究发展战略计划》
  13. MongoDB应用场景及选型(海量数据存储选型)
  14. (附源码)springboot社区疫情防控管理系统 毕业设计 164621
  15. 威斯敏斯特教堂 名言_新教堂徽标设计师的视角分析
  16. VS Code设置PHP可执行文件
  17. Nacos如何实现统一配置管理
  18. 《复杂网络分析》习题及自我解答
  19. 英语口语练习十三之It's up to... (由……来决定)用法
  20. 神经网络参数个数计算,神经网络的参数设置

热门文章

  1. python random函数sample_Python random.seed() random.sample()函数使用
  2. 成员的访问控制java_java类成员的访问控制(翻译自Java Tutorials)
  3. asp.net编程网页弹窗显示变量_CODESYS Engineering:面向工程应用编程的工具软件
  4. php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
  5. mysql 导出表数据到另一张表_yz-Mysql数据库中一个表中的数据导出来到另外一个数据库的表格...
  6. 安装python的moviepy_MoviePy 安装 配置
  7. 米匡框架实现量化交易炒股
  8. Spring Cloud 第一天课堂笔记
  9. 你是在用计算机算你的人生经历吗,计算机人生规划
  10. 《leetcode》pascals-triangle(杨辉三角)