使用一个非常简单的Demo来展示一下AOP达到的效果。即在某个需要关注的点触发的时候(服务调用,数据库调用,any way 就是切点),进行你的业务操作(before,after,around,throw 等)。

package advice;

public class addAdvice {
public void beforeAdvice(){
System.out.println("==添加操作==");
}
}
package advice;

public class deleteAdvice {
public void beforeAdvice(){
System.out.println("==删除操作==");
}
}

    在applicationContext.xml中加入

<!-- 配置切面类-->
<bean id="addAspect" class="advice.addAdvice"></bean>
<!-- 配置切面类-->
<bean id="deleteAspect" class="advice.deleteAdvice"></bean>
<!-- 配置aop-->
<aop:config>
<!-- 配置切面-->
<aop:aspect ref="addAspect">
<!-- 切点表达式-->
<aop:pointcut id="userAdvice1" expression="execution(* service.UserService.addService(..))"/>
<aop:before method="beforeAdvice" pointcut-ref="userAdvice1"></aop:before>
</aop:aspect>
</aop:config> <aop:config>
<!-- 配置切面-->
<aop:aspect ref="deleteAspect">
<!-- 切点表达式-->
<aop:pointcut id="userAdvice2" expression="execution(* service.UserService.deleteService(..))"/>
<aop:before method="beforeAdvice" pointcut-ref="userAdvice2"></aop:before>
</aop:aspect>
</aop:config>

    使用aop标签之前必须先加入dtd

xmlns:aop="http://www.springframework.org/schema/aop"

http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

    切面表示的是你要使用的那个通知类,通知类里面是对切点类的前后加入执行方法的类。切点类就是当这个类执行到指定方法的时候回执行切面类方法的类。

    切点表达式的第一个*表示任意返回值,可以把包后面的UserService改成*,这样就是对service下的所有方法执行切面方法。

    <aop:before/>是定义一个前置通知,还有其他三种方式就不介绍了。

  • 对AOP基本元素的总结

    To use it,we need Spring。废话,AOP就是Spring提供的一种开发模式(大胆定义)。you can image,在Spring的Bean代理框架中,所有的method都是Spring里面bean instance的invoke操作。所以Spring会关注你是否在invoke中定义了切面,如果定义了,那就如代理模式中所描述的一样,invoke你方法的前后执行你的切面。

    在最新的Spring中需要定义一个切面,不需要各种各样的配置,只需要告诉Spring 你是一个Bean,并且你是一个切面就好。

/**
* 对接服务日志参数打印
*/
@Component
@Aspect
public class ClientLog

    但是要确保,scan有把你的路径扫进去,不然不能叫“告诉”了Spring。

    这里将要提供两种比较简单的,立即可以上手编程的切面定义方法。

    1.对路径直接实施切面(这是我最早使用的一种方案,seems stupid)

    //日志切面
@Pointcut("execution(* com.timevale.*.common.service.integration.*.client.UserAccountIdentifyClient.*(..))")
private void clientLogPointCut(){}

    这个切点表达式非常的简便,并且易于理解。

    第一个*,表示他的返回值泛型,最后的(..)表示方法入参的随意性,最后,IDEA会告诉你你的切点表达式是否有效果(当你按着ctrl点击最后那个*的时候,他会显示被切点作用到的方法名称)。

    这个方法stupid,因为他非常不灵活,如果你要在一个类中某些方法不被切到,那你在定义切点表达式时候,需要用同样的后缀或者前缀或者公共子段进行方法命名,比如*.client.UserAccountIdentifyClient.*Demo(..)。

    2.Annotation切点(非常灵活)

    只需要在你需要关注的方法上定义一个注解,那么你的方法就会进入切面了,是目前最优美的方案了。

    @Pointcut("@annotation(com.timevale.*.core.service.*.annotation.Billing)")
private void needBillingAspect() {
}

    只要带有@Biiling这个注解的方法,都会进行切面操作。

  •  方案应用

    AOP适合什么样的场景?一般来说,就是common的场景,譬如日志操作,计费操作,通知操作(都是我做过的方案)。

    1.对于日志操作,思路简单,需要把这个切点的入参出参打印出来,或者做数据埋点等等操作。

    2.对于计费操作,很明显,我们在提供open service接口的时候,需要进行计费。而业务成功后计费如果嵌入到业务代码中,显得有点disgusting。那我们可以around一下,在入参中定义一个基类,里面有计费的type,每次切到的结果,即使子类不一样(因为不同的业务参数入参不一样),但是始终能转化为父类并拿到计费基本参数。

    3.至于通知,我们使用的是消息投递的方式(way is not important),在关心的那个事件发生的时候,发送通知,不同的子业务,通常有一个业务流程,这个流程失败的时候,所触发的动作是一样的(更新库失败)

spring aop的使用的更多相关文章

  1. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  6. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  10. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

随机推荐

  1. angularJS操作键值对象(类似java的hashmap)填坑小结

    前言: 我们知道java的hashmap中使用最多的是put(...),get(...)以及remove()方法,那么在angularJS中如何创造(使用)这样一个对象呢 思路分析: 我们知道在jav ...

  2. 删除Windows中隐藏的物理网卡和网络虚拟化失败后的虚拟网卡

    Windows环境下,在更换硬件服务器主板和网卡等硬件.恢复操作系统或者网络虚拟化失败后,可能会出现网卡方面的问题.例如,设备管理器中多了不应该存在的网卡:因命名冲突无法重命名当前网络连接:IP地址冲 ...

  3. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  4. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数

    前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...

  5. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...

  6. POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

    题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...

  7. Shell(C++实现,CodeBlocks+GCC编译)

    程序效果: 只实现了login .cd .ls .cat 四个命令.而且只能在 Windows 下运行. 代码: //main.cpp 1 #include <iostream> #inc ...

  8. PAT 1039. 到底买不买(20)

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  9. 代码覆盖工具(gcov、lcov)的使用

    一.安装 gcov:是随gcc一起发布的,并不需要独立安装:lcov:其他博客说是随ltp发布的,结果下载下ltp之后编译了10多分钟,最后也没见lcov,最后到sourceforge下载了lcov单 ...

  10. textarea去掉右侧滚动条,去掉右下角拖拽

    代码: <TEXTAREA style= "overflow:hidden; resize:none; "> </TEXTAREA> 当使用背景图片的时候, ...