切面类:

package com.atChina.Test2;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;/*** @Aspect:来自aspectj框架,表示当前类是切面类* 切面类是用来给业务方法增强功能的类*/
@Aspect
public class MyAspect {/*** @AfterReturning:后置通知,在目标方法之后调用*  属性:1. value,表示切入点表达式(切面功能加入的位置)*       2. returning,自定义变量名,表示目标方法的返回值.自定义的变量名需要和通知方法的参数名一样*  位置:在方法的上面* * 后置通知的特点:*  1.在目标方法之后执行*  2.能够获取目标方法的执行结果,并且还可以对执行结果进行修改*    1).目标方法返回值是简单类型(String和java基本数据类型),在通知方法中修改返回值不会影响目标方法的最终结果*    2).目标方法返回值是非简单类型,在通知方法中修改返回值的属性值,这样就会影响目标方法的最终结果*  3.不会影响目标方法的执行*  *//**  Object result = Student getStudent() 返回值是字符串*   afterStudent(result);  // 参数传递的是值*   *   后置通知方法中也可以有JoinPoint参数,如果通知方法中有多个参数,JoinPoint一定是第一个参数*/@AfterReturning(value="execution(* *..SomeServiceImpl.do*(..))", returning="result")public void afterFunc(JoinPoint jp, Object result){System.out.println("获取切入点的方法名称:"+jp.getSignature().getName());if(result instanceof String){result = ((String)result).toUpperCase();}System.out.println("目标方法的返回值result:"+result);System.out.println("执行了后置通知......");}/**  Object result = Student getStudent() 返回值是对象*   afterStudent(result);  // 参数传递的是引用*/@AfterReturning(value="execution(* *..SomeServiceImpl.get*(..))", returning="result")public void afterStudent(Object result){if(result != null){Student st = (Student)result;st.setAge(21);st.setName("八戒");}System.out.println("执行了后置通知......");}
}

普通bean

package com.atChina.Test2;public interface SomeService {public void doSome();public String doOther(String params);public Student getStudent();
}package com.atChina.Test2;public class SomeServiceImpl implements SomeService {@Overridepublic void doSome() {System.out.println("执行了doSome业务方法...");}@Overridepublic String doOther(String params) {// TODO Auto-generated method stubSystem.out.println("执行了doSome业务方法..."+params);return params;}@Overridepublic Student getStudent() {Student st = new Student();st.setAge(22);st.setName("孙悟空");return st;}}package com.atChina.Test2;public class Student {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}

配置bean以及声明自定代理生成器

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引用Spring的多个Schema空间的格式定义文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd "><!-- 声明目标类对象 --><bean id="someService" class="com.atChina.Test2.SomeServiceImpl" /><!-- 声明切面类对象 --><bean id="myAspect" class="com.atChina.Test2.MyAspect" /><!-- 声明自动代理生成器,创建代理对象 --><aop:aspectj-autoproxy /> <!-- 寻找aspectj框架能够识别的标签 -->
</beans>

测试类以及测试结果:

@Testpublic void test1(){String configLocation = "com/atChina/Test2/applicationContext.xml"; // 类路径的根目录ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);// 目标对象有接口,aspectj默认使用的是jdk动态代理SomeService proxy = (SomeService) ctx.getBean("someService");System.out.println(proxy.getClass().getName());// proxy.doSome();System.out.println("===================================");String result = proxy.doOther("taimxai");System.out.println("返回值result:"+result);System.out.println("===================================");Student st = proxy.getStudent();System.out.println("返回值result:"+st);}测试结果:
com.sun.proxy.$Proxy8
===================================
执行了doSome业务方法...taimxai
获取切入点的方法名称:doOther
目标方法的返回值result:TAIMXAI
执行了后置通知......
返回值result:taimxai
===================================
执行了后置通知......
返回值result:Student [name=八戒, age=21]

spring21:Aspectj实现后置通知@AfterReturning相关推荐

  1. 配置切入点表达式|| 前置通知、后置通知、异常通知、最终通知、环绕通知

    环绕通知 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  2. Spring AOP中的前置通知和后置通知详解

    不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现.而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现, ...

  3. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)

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

  4. spring之aop(前置通知,后置通知,环绕通知,过滤通知,异常通知)

    1.AOP中关键性概念  连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻辑 通知(Advice ...

  5. spring之AOP(面向切面编程)和五大通知(前置通知、后置通知、异常通知、环绕通知、过滤通知)

    一.aop的介绍 1.AOP中关键性概念 : 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出. 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻 ...

  6. PHP通过__call实现简单的AOP(主事务后的其他操作)比如前置通知,后置通知

    /*** person class*/ class Person {/*** person class -> function say*/public static function say($ ...

  7. Spring3.0中的前置通知、后置通知、环绕通知、异常通知

    观众类Audience~~ [java] view plain copy package com.jCuckoo.demo; import org.aspectj.lang.ProceedingJoi ...

  8. 后置通知(After Advice)

    当某连接点退出的时候执行的通知(不论是正常返回还是异常退出).ApplicationContext 中在<aop:aspect>里面使用<aop:after>元素进行声明.例如 ...

  9. AOP日志-后置通知

    创建切面类处理日志 @Component @Aspect public class LogAop {@Autowiredprivate HttpServletRequest request;@Auto ...

最新文章

  1. 怎样将jsonObject类型转换为date数据类型?
  2. 由PostgreSQL的区域与字符集说起
  3. boost::mp11::mp_transform相关用法的测试程序
  4. oracle_sid只能有一个吗_第一次考教资!这些问题你都了解了吗?
  5. 解读Facebook CAN:如何给人工智能赋予艺术创作的力量
  6. 【Java】集合框架基础编程练习题
  7. mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change
  8. JavaScript学习(八十一)—将多维数组转化为一维数组
  9. JQuery中的事件委托
  10. 【VS2017】VS2017离线安装教程
  11. 单片机之flash读写
  12. java流媒体直播_实时监控、直播流、流媒体、视频网站开发方案设计简要
  13. TOP100summit2017:微博如何做到1小时增加一千台服务器应对鹿晗恋情带来的流量暴增
  14. 布局区块链数据中心的互联在线,积极筹备精选层
  15. Android手机投影到电脑屏幕的神兵利器
  16. html 怎么检测ie浏览器的最高版本号,怎样在HTML代码里面判断IE版本?
  17. STM32普通IO模拟SPI和W25Q32通信调试
  18. 获取gridview当前选中行的内容
  19. mysql inet aton ipv6_在MySQL中存储IPv6地址
  20. 图片混合BlendMode之互补色简单计算法

热门文章

  1. 【leetcode】500. Keyboard Row
  2. 关于html5和css3的新特性
  3. 用Jquery控制文本框只能输入数字和字母及jquery自定义方法$.fn
  4. 随时牵手,不要随意分手
  5. 【python初识】文件存储与异常
  6. Git/TortoiseGit使用
  7. Mycat简单实现读写分离与分库分表
  8. JavaScript onerror事件
  9. VC中的Attach和Detach
  10. 日期代码的js 中将2012年显示成了112年