Spring 2.X 中AOP的简明教程
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的简明教程相关推荐
- 【干货】深度学习中的线性代数---简明教程
作者 | Vihar Kurama 编译 | 专知 整理 | Mandy 线性代数对于理解机器学习和深度学习内部原理至关重要,线性代数是有关连续值的数学.许多计算机科学家在此方面经验不足,传统上计算机 ...
- 怎么html中加样式,简明教程 在HTML中添加样式表的方法
CSS语句内嵌到HTML文档内的方法有四种. 1.最直接的方法是将CSS样式语句直接写在HTML的标识符(tag)里: <Tag style="properties"> ...
- html文档中strokestyle,HTML5简明教程-1.1.2.HTML5Canvas参考手册 之 笔触strokeStyle
今天介绍canvas的另一个重要属性strokeStyle,strokeStyle属性定义了我们在canvas画布上进行图形绘制时的"笔触",简单点说,就是定义了我们的画笔样式.另 ...
- CoreMotion框架中加速度计使用简明教程
前言 之前有人通过iPhone的加速度计做出一个手机防盗APP,而且正是通过这个防盗APP拿到天使投资.从此以后华丽转身,公司发展的有声有色.虽然这个项目最后不怎么样,但是,确实是一个不错的想法. 也 ...
- spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解
Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...
- Spring中AOP实现
1.什么是SpringAOP 什么是aop:Aspect Oriented Programming的缩写,面向切面编程,通过预编译和动态代理实现程序功能的 统一维护的一种技术 主要功能:日志记录,性能 ...
- CentOs6.5中安装和配置vsftp简明教程
这篇文章主要介绍了CentOs6.5中安装和配置vsftp简明教程,需要的朋友可以参考下 一.vsftp安装篇 复制代码代码如下: # 安装vsftpd yum -y install vsftpd # ...
- spring中aop事务
文章目录 事务 为什要用到Spring中AOP事务 事物的特性 ACID 事务并发问题 事务的隔离级别 spring事务管理 事务操作 事务操作对象 spring管理事务的属性介绍 spring管理事 ...
- java获取keyvault_教程:在 Java Spring Boot 应用中使用 Azure 应用程序配置 Key Vault 引用 | Microsoft Docs...
您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 教程:在 Java S ...
最新文章
- 图像处理学习三(频域图像增强)
- 英国拟在其国内建立一套互联网过滤网
- Tomcat+Apache 负载均衡
- 【SDK接入篇】【1】Unity的internal 与 gradle打包
- Laravel 多用户认证
- 解决 service、killall 等命令找不到的问题
- C语言家谱管理程序,c语言的家谱——interesting~
- mysql 查询一个数据库里面有多少张数据表
- 【渝粤教育】广东开放大学 普通话训练 形成性考核 (48)
- 多年前,初始架构:php+mysql下,对网站架构方面的一些认识
- 板簧的弹性系数如何计算_滑板式钢板弹簧悬架变刚度计算方法的研究
- 美国白宫《国家人工智能研究发展战略计划》
- MongoDB应用场景及选型(海量数据存储选型)
- (附源码)springboot社区疫情防控管理系统 毕业设计 164621
- 威斯敏斯特教堂 名言_新教堂徽标设计师的视角分析
- VS Code设置PHP可执行文件
- Nacos如何实现统一配置管理
- 《复杂网络分析》习题及自我解答
- 英语口语练习十三之It's up to... (由……来决定)用法
- 神经网络参数个数计算,神经网络的参数设置
热门文章
- python random函数sample_Python random.seed() random.sample()函数使用
- 成员的访问控制java_java类成员的访问控制(翻译自Java Tutorials)
- asp.net编程网页弹窗显示变量_CODESYS Engineering:面向工程应用编程的工具软件
- php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
- mysql 导出表数据到另一张表_yz-Mysql数据库中一个表中的数据导出来到另外一个数据库的表格...
- 安装python的moviepy_MoviePy 安装 配置
- 米匡框架实现量化交易炒股
- Spring Cloud 第一天课堂笔记
- 你是在用计算机算你的人生经历吗,计算机人生规划
- 《leetcode》pascals-triangle(杨辉三角)