环绕增强在目标方法的前后都可以织入增强处理,环绕增强是功能最强大的增强处理,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.测试效果