环绕增强

Posted 大师兄丶2K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环绕增强相关的知识,希望对你有一定的参考价值。

  环绕增强在目标方法的前后都可以织入增强处理,环绕增强是功能最强大的增强处理,spring把目标方法的控制权全部交给了它,在环绕增强处理中,可以获取或修改目标方法的参数、返回值、,可以对它进行异常处理,其次可以决定目标方法是否执行。

1.AroundLogger类

 1 package com.aop;
 2 
 3 import java.lang.reflect.Method;
 4 import java.util.Arrays;
 5 
 6 import org.aopalliance.intercept.MethodInterceptor;
 7 import org.aopalliance.intercept.MethodInvocation;
 8 import org.apache.log4j.Logger;
 9 /**
10  * 
11  * @author Mr
12  * 环绕增强处理
13  */
14 public class AroundLogger implements MethodInterceptor {
15     
16     private static final Logger log = Logger.getLogger(AroundLogger.class);
17     
18     @Override
19     public Object invoke(MethodInvocation arg0) throws Throwable {
20         //处理代理对象
21         Object obj = arg0.getThis();
22         //获取代理方法
23         Method method =arg0.getMethod();
24         //获取方法参数
25         Object [] args = arg0.getArguments();
26         log.info("调用"+obj+"的"+method.getName()+"方法,方法参数是:"
27                 +Arrays.toString(args));
28         try {
29             Object result = arg0.proceed();//调用目标方法,获取目标方法的返回值
30             log.info("调用"+obj+"的"+method.getName()+"方法,方法返回值是:"
31                     +result);
32             return result;
33         } catch (Exception e) {
34             log.error(method.getName()+"方法抛出异常"+e);
35             e.printStackTrace();
36         }
37         
38         
39         return null;
40     }
41 
42 }

2.spring配置文件,记得把IUserDaoImpl.java中的自定义异常删掉

 1     <bean id="dao" class="com.dao.impl.IUserDaoImpl"></bean>
 2     <bean id="biz" class="com.biz.impl.IUserBizImpl">
 3         <property name="dao" ref="dao"></property>
 4     </bean>
 5     <bean id="aroundlog" class="com.aop.AroundLogger"></bean>
 6     <aop:config>
 7     <!-- <aop:pointcut expression="execution(public void save(com.domain.User))" id="pointcut"/>-->
 8         <aop:pointcut expression="execution(* com.biz.IUserBiz.*(..))" id="pointcut"/>
 9         <aop:advisor advice-ref="aroundlog" pointcut-ref="pointcut"/>
10     </aop:config>

3.测试类

 1 package com.test;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 import com.biz.IUserBiz;
 6 import com.domain.User;
 7 
 8 /**
 9  * 
10  * @author Mr
11  * aop测试类
12  */
13 public class Test {
14 
15     public static void main(String[] args) {
16         //解析配置文件
17         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
18         
19         IUserBiz biz = (IUserBiz) ac.getBean("biz");
20         User user = new User();
21         user.setUname("小老虎");
22         biz.save(user);
23     }
24 
25 }

4.测试效果

 

以上是关于环绕增强的主要内容,如果未能解决你的问题,请参考以下文章

3.24 切面发布-环绕通知

spring框架前置增强,后置增强,和环挠增强,异常增强有什么作用

springBoot AOP环绕增强自定义注解log4j2MDC

Spring框架-AOP原理

Spring学习(二十五)Spring AOP之增强介绍

OpenGL片段着色器不照亮场景