zoukankan      html  css  js  c++  java
  • 利用aop插入异常日志的2种方式

      AOP是面向切面编程,利用这个技术可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分的耦合性降低,提高代码的可重用性,同时提高开发效率(来自百度百科)。

      Spring AOP有两种实现方式,一种是在spring-mvc中进行配置,一种是通过注解的方式实现。

    //封装共同处理:将异常信息写入文件中(日志)
    @Component
    @Aspect
    public class ExceptionHanlder {
    
    	//定义规则:public void 方法名(异常类型参数)//异常通知
    	@AfterThrowing(throwing="e",pointcut="within(org.controller..*)")
    	public void handler(Exception e){
    		//e变量就是目标组件抛出的异常对象
    		try {//以追加方式写入
    			FileWriter fw = 
    				new FileWriter("note.log",true);
    			PrintWriter pw = new PrintWriter(fw);
    			//打印错误标题
    			pw.println("************************************");
    			pw.println("异常类型:"+e);
    			pw.println("发生时间:"+new Date());
    			pw.println("************************************");
    			e.printStackTrace(pw);//将异常栈信息写入note.log
    			pw.flush();
    		} catch (IOException e1) {
    			System.out.println("记录异常日志失败");
    		} finally{
    			pw.close();
    			fw.close();
    		}
    	}
    	
    }
    

      

    #############################################################################################
    package org.aopTest.aspect;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    //封装共同处理的组件
    @Component//扫描,等价于<bean>定义
    @Aspect//等价于<aop:aspect ref="">
    public class LoggerBean {
    
        //要在Controller.execute开始位置切入
        //方法规则:public void 方法名(){...} (前置通知)
        @Before("within(org.aopTest.controller..*)")
        //等价于<aop:before method="logController" pointcut="">
        public void logController(){
            System.out.println("进入Controller组件处理");
        }
        
    }
    
    ##################################################################################################
    【注解方式】
    <!-- AOP注解配置 -->
    <!--  利用组件扫描,将Aspect组件纳入Spring容器 -->
    <context:component-scan 
        base-package="org.aopTest.aspect"/>
    <!-- 开启AOP注解支持@Aspect,@Before等 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
    
    ##################################################################################################
    【javaBean方式】
    <!-- 定义共同处理组件 -->
    <bean id="loggerBean" 
    class="org.aopTest.aspect.LoggerBean">
    </bean>
    <!-- 将loggerBean组件切入到Controller方法上 -->
    <aop:config>
       <!-- 要切入哪个共同处理组件,ref指定共同组件id值 -->
        <aop:aspect ref="loggerBean">
            <!-- aop:before表示在目标方法之前切入,
                method指定方法名;pointcut指定目标组件 -->
            <aop:before method="logController" 
    pointcut="within(org.aopTest.controller..*)"/>
        </aop:aspect>
    </aop:config>
    
    <!-- 采用AOP方法追加记录异常日志 -->
    <bean id="exceptionHanlder" 
    class="org.aopTest.aspect.ExceptionHanlder">
    </bean>
    
    <aop:config>
        <aop:aspect ref="exceptionHanlder">
            <aop:after-throwing method="handler"
                throwing="e"
    pointcut="within(org.aopTest.controller..*)"/>
        </aop:aspect>
    </aop:config>
    ##################################################################################################
    休闲玩家 佛系更博
  • 相关阅读:
    sql行列转换问题 .
    JS常用正则表达式
    sql语句导入导出大全 .
    (国际)(2)“金环日食”
    java小问题总结1
    告诉你的安全方法:window xp双重加密
    专业解不是win32应用程序
    CSDN最HOT信息收藏
    DotNet 网上资源1(转贴)
    歪批IT之加班 IT就是我累了?
  • 原文地址:https://www.cnblogs.com/yuyuchen/p/8084479.html
Copyright © 2011-2022 走看看