利用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>
##################################################################################################
休闲玩家 佛系更博
原文地址:https://www.cnblogs.com/yuyuchen/p/8084479.html