前面两个文章介绍了Aop及其相关重要概念,下面主要用代码的方式介绍下实现Spring Aop的几种方式

1. 基于注解实现Spring Aop

业务类接口

  1. package cn.test.business;
  2.  
  3. public interface Work {
  4.  
  5. public void doWork(String userName);
  6. }

业务类实现


  1. package cn.test.business;
  2.  
  3. public class Worker implements Work{
  4.  
  5. @Override
  6. public void doWork(String userName) {
  7. System.out.println(userName + " is working !");
  8. }
  9. }

注解实现切面类


  1. @Aspect
  2. public class AopAnnotationTest {
  3.  
  4. @Pointcut("execution(* cn.test.business.*.*(..))")
  5. private void anyMethod(){}//定义一个切入点
  6.  
  7. @Before("anyMethod() && args(name)")
  8. public void doBefore(String name){
  9. System.out.println("doBefore...");
  10. }
  11.  
  12. @AfterReturning("anyMethod()")
  13. public void doAfterReturning(){
  14. System.out.println("doAfterReturning...");
  15. }
  16.  
  17. @After("anyMethod()")
  18. public void doAfter(){
  19. System.out.println("doAfter...");
  20. }
  21.  
  22. @Around("anyMethod()")
  23. public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
  24. System.out.println("begin doAround...");
  25. Object object = joinPoint.proceed();
  26. System.out.println("after doAround...");
  27. return object;
  28. }
  29.  
  30. @AfterThrowing("anyMethod()")
  31. public void doThrow(){
  32. System.out.println("意外通知");
  33. }
  34. }

spring配置文件:spring-aop.xml


  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-2.5.xsd
  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  10.  
  11. <bean id="work" class="cn.test.business.Worker"></bean>
  12.  
  13. <!-- aop注解 实现 -->
  14. <aop:aspectj-autoproxy/>
  15. <bean id="anno-beforeadvice" class="cn.test.aop.advice.annoation.impl.AopAnnotationTest"/>
  16.  
  17. <!-- 实现相应的Advice方法实现aop -->
  18. <!-- <bean id="logBeforeAdvice" class="cn.test.aop.advice.inteface.impl.LogBeforeAdvice"></bean>
  19. <bean id="logAfterReturnAdvice" class="cn.test.aop.advice.inteface.impl.LogAfterReturnAdvice"></bean>
  20. <bean id="logExceptionAdvice" class="cn.test.aop.advice.inteface.impl.LogExceptionAdvice"></bean>
  21. <bean id="logAroundAdvice" class="cn.test.aop.advice.inteface.impl.LogAroundAdvice"></bean>
  22.  
  23. <aop:config>
  24. <aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
  25. <aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="pointcut"/>
  26. <aop:advisor advice-ref="logAfterReturnAdvice" pointcut-ref="pointcut"/>
  27. <aop:advisor advice-ref="logAroundAdvice" pointcut-ref="pointcut"/>
  28. <aop:advisor advice-ref="logExceptionAdvice" pointcut-ref="pointcut"/>
  29. </aop:config> -->
  30.  
  31. <!-- 定义一个切面类 -->
  32. <!-- <bean id="logAspect" class="cn.test.aop.advice.defineAspectClass.impl.TestAspect"></bean>
  33. <aop:config>
  34. <aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
  35. <aop:aspect id="aspect" ref="logAspect">
  36. <aop:before pointcut-ref="pointcut" method="doBefore"/>
  37. <aop:after-returning pointcut-ref="pointcut" method="afterReturning" returning="retValue"/>
  38. <aop:after-throwing pointcut-ref="pointcut" method="doThrowing" throwing="ex"/>
  39. <aop:after pointcut-ref="pointcut" method="doAfter"/>
  40. <aop:around pointcut-ref="pointcut" method="doAround"/>
  41. </aop:aspect>
  42. </aop:config> -->
  43. </beans>

测试类:


  1. package cn.test.aop.test;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.test.context.ContextConfiguration;
  6. import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
  7.  
  8. import cn.test.business.Work;
  9.  
  10. @ContextConfiguration(
  11. locations={
  12. "classpath:/spring-aop.xml"
  13. }
  14. )
  15. public class SpringAopTest extends AbstractJUnit4SpringContextTests{
  16.  
  17. @Autowired
  18. private Work work;
  19.  
  20. @Test
  21. public void aopTest(){
  22. work.doWork("张三");
  23. }
  24. }

测试结果:


  1. begin doAround...
  2. doBefore...
  3. 张三 is working !
  4. after doAround...
  5. doAfter...
  6. doAfterReturning...

2. 实现Adivce接口的方式实现Spring Aop

定义前置通知

  1. public class LogBeforeAdvice implements MethodBeforeAdvice {
  2.  
  3. @Override
  4. public void before(Method method, Object[] args, Object target)
  5. throws Throwable {
  6. System.out.println(args[0] + "开始工作!");
  7. }
  8. }

定义环绕通知


  1. public class LogAroundAdvice implements MethodInterceptor{
  2.  
  3. @Override
  4. public Object invoke(MethodInvocation arg0) throws Throwable {
  5. System.out.println(arg0.getArguments()[0] + " 工作中,请勿打扰...");
  6. Object obj = arg0.proceed();
  7. System.out.println(arg0.getArguments()[0] + " 工作完成...");
  8. return obj;
  9. }
  10. }

定义返回后通知


  1. public class LogAfterReturnAdvice implements AfterReturningAdvice{
  2.  
  3. @Override
  4. public void afterReturning(Object returnValue, Method method,
  5. Object[] args, Object target) throws Throwable {
  6. System.out.println(args[0] + "完成工作");
  7. }
  8. }

定义抛出异常后通知


  1. public class LogExceptionAdvice implements ThrowsAdvice{
  2.  
  3. public void afterThrowing(Method method, Object[] parameters, Object target, Exception ex){
  4. System.out.println(parameters[0] + " 工作中出现异常... ");
  5. }
  6. }

spring配置文件:只需要把上面的配置文件中第二部分打开即可。


  1. <!-- 实现相应的Advice方法实现aop -->
  2. <bean id="logBeforeAdvice" class="cn.test.aop.advice.inteface.impl.LogBeforeAdvice"></bean>
  3. <bean id="logAfterReturnAdvice" class="cn.test.aop.advice.inteface.impl.LogAfterReturnAdvice"></bean>
  4. <bean id="logExceptionAdvice" class="cn.test.aop.advice.inteface.impl.LogExceptionAdvice"></bean>
  5. <bean id="logAroundAdvice" class="cn.test.aop.advice.inteface.impl.LogAroundAdvice"></bean>
  6.  
  7. <aop:config>
  8. <aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
  9. <aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="pointcut"/>
  10. <aop:advisor advice-ref="logAfterReturnAdvice" pointcut-ref="pointcut"/>
  11. <aop:advisor advice-ref="logAroundAdvice" pointcut-ref="pointcut"/>
  12. <aop:advisor advice-ref="logExceptionAdvice" pointcut-ref="pointcut"/>
  13. </aop:config>

3. 定义切面类的方式实现Spring Aop

切面类

  1. public class TestAspect {
  2.  
  3. public void doAfter(JoinPoint jp) {
  4. System.out.println(jp.getArgs()[0] + " 回家...");
  5. }
  6.  
  7. public void afterReturning (JoinPoint joinPoint, Object retValue) {
  8. System.out.println(joinPoint.getArgs()[0] + " 结束工作...");
  9. }
  10.  
  11. public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
  12. long time = System.currentTimeMillis();
  13. Object retVal = pjp.proceed();
  14. time = System.currentTimeMillis() - time;
  15. System.out.println(pjp.getArgs()[0] +" 工作时间: " + time + " ms");
  16. return retVal;
  17. }
  18.  
  19. public void doBefore(JoinPoint jp) {
  20. System.out.println(jp.getArgs()[0] + " 开始工作...");
  21. }
  22.  
  23. public void doThrowing(JoinPoint jp, Throwable ex) {
  24. System.out.println(jp.getArgs()[0] + " 工作中出现异常... " + ex);
  25. }
  26. }

spring配置文件:


  1. <bean id="logAspect" class="cn.test.aop.advice.defineAspectClass.impl.TestAspect"></bean>
  2. <aop:config>
  3. <aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
  4. <aop:aspect id="aspect" ref="logAspect">
  5. <aop:before pointcut-ref="pointcut" method="doBefore"/>
  6. <aop:after-returning pointcut-ref="pointcut" method="afterReturning" returning="retValue"/>
  7. <aop:after-throwing pointcut-ref="pointcut" method="doThrowing" throwing="ex"/>
  8. <aop:after pointcut-ref="pointcut" method="doAfter"/>
  9. <aop:around pointcut-ref="pointcut" method="doAround"/>
  10. </aop:aspect>
  11. </aop:config>






Spring Aop实现方式总结的更多相关文章

  1. Spring AOP配置方式

    AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...

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

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

  3. (转)Spring AOP实现方式(转)

    我们可以通过三种方式来使用Spring AOP,它们分别是:@Aspect-based(Annotation),Schema-based(XML),以及底层的Spring AOP API 底层的Spr ...

  4. Spring AOP实现方式四之注入式AspectJ切面【附源码】

    现在我们要讲的是第四种AOP实现之注入式AspectJ切面 通过简单的配置就可以实现AOP了. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.ao ...

  5. Spring AOP实现方式三之自动扫描注入【附源码】

    注解AOP实现  这里唯一不同的就是application 里面 不需要配置每个bean都需要配置了,直接自动扫描 注册,主要知识点是怎么通过配置文件得到bean, 注意类前面的@注解. 源码结构: ...

  6. Spring AOP实现方式三【附源码】

    注解AOP实现 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator ...

  7. Spring AOP实现方式二【附源码】

    自动代理模式[和我们说的方式一 配置 和 测试调用不一样哦~~~]  纯POJO切面 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /* ...

  8. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  9. 转:Spring AOP 注解方式实现的一些“坑”

    使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...

随机推荐

  1. yii学习随感

    最近我们公司信易网络在用yii开发一个项目自己临时学习了一下yii 把学习感悟和大家一起分享一下 Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供 ...

  2. php tpl 模板页面如和给js文件传参数

    有一个参数,服务器传给了php 模板页面,但模板包含的js需要得到这个参数值.如何处理: 一,在引入页面前加一句代码 <script type="text/javascript&quo ...

  3. C#——System.Diagnostics.Process.Start的妙用

    我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...

  4. 离开ACM了,总结一下

    写这篇博客,一如当初我对着电脑显示器,不知道从哪里下手才是,所以没准写着写着就出现了倒叙插叙补叙等充满语文功底的修辞手法,不过不会有45度的妩媚和忧伤. 像一位程序员所说:今天的努力是为了儿时吹过的牛 ...

  5. iOS开发 - NSBundle, NSDevice, NSLocale

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  6. #include<filename.h> 与 #include“filename.h”

    #include<filename.h>:从标准库路径去寻找该文件,对于VC来说,应该还包括VC环境设置选项中的包含目录以及工程属性中指定的目录. #include“filename.h” ...

  7. Django下TemplateDoesNotExist 异常的解决方法:

    在settings中添加代码如下获取templates路径: import os import os.path BASE_DIR = os.path.dirname(os.path.dirname(_ ...

  8. 简析LIVE555中的延时队列

    http://www.cnblogs.com/nightwatcher/archive/2011/04/10/2011158.html 最近在看LIVE555的源码,感觉其中的延时队列写的不错,于是就 ...

  9. 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的

    1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...

  10. nginx+gunicorn

    wsgi接口,使用gunicorn作为server,想在外层加nginx. 配置了 proxy_pass   http://127.0.0.1:9008; 访问报301. 参考gunicorn 官网配 ...