zoukankan      html  css  js  c++  java
  • spring 12-Spring框架AOP深入配置

    AOP深入配置可以实现以下功能:

    • 前置通知的参数传递
    • 返回通知
    • 针对异常进行处理

    1、定义业务层接口和子类

    package cn.liang.service;
    public interface IMessageService {
    	public boolean remove(String mid) ;
    }
    
    package cn.liang.service.impl;
    import org.apache.log4j.Logger;
    import cn.liang.service.IMessageService;
    public class MessageServiceImpl implements IMessageService {
    	@Override
    	public boolean remove(String mid) {
    		Logger.getLogger(IMessageService.class).info("【业务层】执行删除调用,删除的数据ID = " + mid);
    		return false;
    	}
    }
    

    2、定义一个描述AOP程序处理的结构类

    package cn.liang.service.proxy;
    import org.apache.log4j.Logger;
    public class ServiceProxy {
    	public void beforeInvoke(Object arg) {
    		Logger.getLogger(ServiceProxy.class).info("【ServiceProxy - BEFORE】在业务方法执行之前进行调用,参数内容:" + arg);
    	} 
    	public void throwInvoke(Exception e) {
    		Logger.getLogger(ServiceProxy.class).error("【ServiceProxy - EXCEPTION】抛出异常:" + e);
    	}
    	public void afterInvoke() {
    		Logger.getLogger(ServiceProxy.class).info("【ServiceProxy - AFTER】在业务方法执行之后进行调用。");
    	}
    	public void returnInvoke(Object val) {
    		Logger.getLogger(ServiceProxy.class).info("【ServiceProxy - RETURNING】返回值 = " + val);
    	}	
    }
    

    3、配置applicationContext.xml文件

    <bean id="messageServiceImpl" class="cn.liang.service.impl.MessageServiceImpl"/>
    <bean id="serviceProxy" class="cn.liang.service.proxy.ServiceProxy"/>
    <aop:config>
    	<aop:pointcut expression="execution(* cn.liang.service..*.*(..)) and args(id)"
    		id="defaultPointCut" />
    	<aop:aspect ref="serviceProxy">
    		<aop:before method="beforeInvoke" pointcut-ref="defaultPointCut"
    			arg-names="id" />
    		<aop:after method="afterInvoke" pointcut="execution(* cn.liang.service..*.*(..))" />
    		<aop:after-returning method="returnInvoke"
    			pointcut="execution(* cn.liang.service..*.*(..))" returning="v"
    			arg-names="v" />
    		<aop:after-throwing method="throwInvoke"
    			pointcut="execution(* cn.liang.service..*.*(..))" throwing="e"
    			arg-names="e" />
    	</aop:aspect>
    </aop:config>
    

    4、编写测试程序

    package cn.liang.test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import cn.liang.service.IMessageService;
    public class TestAOP {
    	public static void main(String[] args) {
    		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    		IMessageService msgService = ctx.getBean("messageServiceImpl", IMessageService.class);
    		System.out.println(msgService.remove("101"));
    	}
    }
    

    5、输出结果

    2018-12-05 16:54:01,793 INFO [cn.liang.service.proxy.ServiceProxy] - 【ServiceProxy - BEFORE】在业务方法执行之前进行调用,参数内容:101
    2018-12-05 16:54:01,794 INFO [cn.liang.service.IMessageService] - 【业务层】执行删除调用,删除的数据ID = 101
    2018-12-05 16:54:01,794 INFO [cn.liang.service.proxy.ServiceProxy] - 【ServiceProxy - AFTER】在业务方法执行之后进行调用。
    2018-12-05 16:54:01,794 INFO [cn.liang.service.proxy.ServiceProxy] - 【ServiceProxy - RETURNING】返回值 = false
    false
    

    AOP深入配置之环绕通知

    1、定义一个描述AOP程序处理的环绕通知结构类

    package cn.liang.service.proxy;
    import java.util.Arrays;
    import org.apache.log4j.Logger;
    import org.aspectj.lang.ProceedingJoinPoint;
    public class ServiceProxy {
    	// 如果要进行后续调用需要知道传递的参数,需要知道具体要调用的业务方法
    		public Object arroundInvoke(ProceedingJoinPoint point) throws Throwable {
    			Logger.getLogger(ServiceProxy.class).info("【*** BEFORE ***】执行参数:" + Arrays.toString(point.getArgs())); 
    			// Object obj = point.proceed(point.getArgs()) ;正常操作要将用户的参数继续向后传递
    			Object obj = point.proceed(new Object[] {"1234"} ) ;	// 自己来处理参数内容
    			Logger.getLogger(ServiceProxy.class).info("【*** AFTER ***】返回结果:" + obj);
    			return true ;
    		}	
    }
    

    2、配置applicationContext.xml文件

    <bean id="messageServiceImpl" class="cn.liang.service.impl.MessageServiceImpl"/>
    <bean id="serviceProxy" class="cn.liang.service.proxy.ServiceProxy"/>
     <aop:config>
     	<aop:pointcut expression="execution(* cn.liang.service..*.*(..))" id="defaultPointCut" />
    	<aop:aspect ref="serviceProxy">
    		<aop:around method="arroundInvoke" pointcut-ref="defaultPointCut"/>
    	</aop:aspect>
     </aop:config>
    

    3、使用TestAOP测试结果

    2018-12-05 17:01:18,190 INFO [cn.liang.service.proxy.ServiceProxy] - 【*** BEFORE ***】执行参数:[101]
    2018-12-05 17:01:18,190 INFO [cn.liang.service.IMessageService] - 【业务层】执行删除调用,删除的数据ID = 1234
    2018-12-05 17:01:18,190 INFO [cn.liang.service.proxy.ServiceProxy] - 【*** AFTER ***】返回结果:false
    true
    
  • 相关阅读:
    关于几种滤波的对比
    学习笔记深入理解Java中的HashMap数据结构
    学习笔记Redis基础常识
    学习笔记Java内存模型
    学习笔记理解GC
    工作中的点点滴滴单例的使用
    工作中的点点滴滴学习一下门面模式
    工作中的点点滴滴接口幂等的问题
    【转载】WCF、WebAPI、WCFREST、WebService之间的区别
    【转载】工具分享——将C#文档注释生成.chm帮助文档
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/10072191.html
Copyright © 2011-2022 走看看