Spring-AOP-通知-环绕通知

今天药忘吃喽~ 2022-06-18 11:41 481阅读 0赞

工程用到的jar包:http://pan.baidu.com/s/1dFFw6at

接口

  1. package com.hk.spring.aop03;
  2. public interface SomeService {
  3. public void doFirst();
  4. public void doSecond();
  5. }

接口实现

  1. package com.hk.spring.aop03;
  2. public class SomeServiceImpl implements SomeService {
  3. @Override
  4. public void doFirst() {
  5. System.out.println("主业务doFirst");
  6. }
  7. @Override
  8. public void doSecond() {
  9. System.out.println("主业务doSecond");
  10. }
  11. }

环绕通知类

  1. package com.hk.spring.aop03;
  2. import org.aopalliance.intercept.MethodInterceptor;
  3. import org.aopalliance.intercept.MethodInvocation;
  4. /** * 环绕通知 * @author 浪丶荡 * */
  5. public class MyMethodInterceptor implements MethodInterceptor {
  6. //在目标方法执行前后都执行
  7. @Override
  8. public Object invoke(MethodInvocation invocation) throws Throwable {
  9. System.out.println("环绕通知被执行,目标方法执行之前");
  10. Object result = invocation.proceed();//调用目标方法
  11. System.out.println("环绕通知被执行,目标方法执行之后");
  12. return result;
  13. }
  14. }

配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
  3. <beans>
  4. <bean name = "someService" class="com.hk.spring.aop03.SomeServiceImpl"></bean>
  5. <!-- 注册通知 -->
  6. <bean name = "myMethodInterceptor" class="com.hk.spring.aop03.MyMethodInterceptor"></bean>
  7. <!-- 生成代理对象 -->
  8. <bean name = "serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  9. <!-- 配置代理对象的目标对象属性 (类加载器)-->
  10. <property name="target" ref="someService"/>
  11. <!-- 或者这样配置 <property name="targetName" value="someService"/> -->
  12. <!-- 配置切面 (方法)-->
  13. <property name="interceptorNames" value="myMethodInterceptor"/>
  14. <!-- 接口通过private boolean autodetectInterfaces = true可以被找到 -->
  15. </bean>
  16. </beans>

测试

  1. package com.hk.spring.aop03;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class Mytest {
  6. @Test
  7. public void test1(){
  8. String resoure = "com/hk/spring/aop03/applicationContext.xml";
  9. ApplicationContext ac = new ClassPathXmlApplicationContext(resoure);
  10. SomeService someService = (SomeService) ac.getBean("serviceProxy");
  11. someService.doFirst();
  12. someService.doSecond();
  13. }
  14. }

结果

  1. 环绕通知被执行,目标方法执行之前
  2. 主业务doFirst
  3. 环绕通知被执行,目标方法执行之后
  4. 环绕通知被执行,目标方法执行之前
  5. 主业务doSecond
  6. 环绕通知被执行,目标方法执行之后

与前置通知、后置通知不同的是导入的包不同,这个导入的是aop联盟的包

环绕通知能获取到目标方法的返回值,且能够改变这个返回值

发表评论

表情:
评论列表 (有 0 条评论,481人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringAOP通知

    spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上。是spring组件中的某个方法、无返回类型、参数类型与通知类型有关。 一个切