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>
##################################################################################################

利用aop插入异常日志的2种方式的更多相关文章

  1. 通过filebeat、logstash、rsyslog采集nginx日志的几种方式

    由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器.而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一.如何有效便捷的 ...

  2. 【转】python之配置日志的几种方式

    [转]python之配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用 ...

  3. sqlserver收缩日志的几种方式

    sqlserver收缩日志的几种方式   [sql] --参考    压缩日志及数据库文件大小      /*--特别注意       请按步骤进行,未进行前面的步骤,请不要做后面的步骤    否则可 ...

  4. Python 配置日志的几种方式

    Python配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: (1)使用Python代码显式的创建loggers,handlers和formatters并分别调用它们的配 ...

  5. Log4Net日志记录两种方式

     简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Ap ...

  6. python之配置日志的三种方式

    以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件,然后使用fileCo ...

  7. Python之配置日志的几种方式(logging模块)

    原文:https://blog.csdn.net/WZ18810463869/article/details/81147167 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Py ...

  8. python之配置日志的几种方式

    作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文 ...

  9. python配置日志的几种方式

    使用的是logging模块,关于logging模块内容,可以看我的另一篇博客:https://www.cnblogs.com/kuxingseng95/p/9464347.html 作为开发者,我们一 ...

随机推荐

  1. ECMAScript6词法

    ES6简介 ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布.ECMAScript 和 JavaScript 的关系是,前者是后 ...

  2. tpshop使用自带极光推送

    推送逻辑在common里面的PushLogic.php;在后台网站->商城设置->推送设置,将极光的ID,密码填一下系统会自动加入数据库里面. 在你所需推送的PHP类里面引用这个文件即可. ...

  3. cocos2dx3.2移植android

    LOCAL_PATH := $(call my-dir)LOCAL_MYDIR = $(LOCAL_PATH)/../../Classesinclude $(CLEAR_VARS) $(call im ...

  4. JS构造函数模式

    构造函数是可以创建特定类型对象的函数,可以接受参数定义函数成员.如果之前做过java比较好理解,举个例子: function exampleFunction(arg1, arg2, arg3){ th ...

  5. Mybatis(二)参数(Parameters)传递

    Mybatis参数(Parameters)传递  1..单个参数 可以接受基本类型,对象类型,集合类型的值.这种情况MyBatis可直接使用这个参数,不需要经过任何处理. <!-- 根据id查询 ...

  6. lodash源码分析之chunk的尺与刀

    以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...

  7. Spring-MVC理解之一:应用上下文webApplicationContext

    一.先说ServletContext javaee标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息.ServletCon ...

  8. 使用DataFlow表达ControlFlow的一些思考

    一.控制流 从接触面向过程语言开始,使用控制流编程的概念已是司空见惯. if (condition) { // do something } else { // do something else } ...

  9. Webpack3.0入门指南

    前言 本文是基于我厂基友的Webpack学习系列(一)初学者使用教程 这篇文章做构建.可能基友的文章是基于Mac环境,我是windows环境,在学习时遇到了很多坑,询问基友,他让我搞个基于window ...

  10. Nginx均衡TCP协议服务器案例

    Nginx在企业运维中通常用来均衡HTTP协议,例如我们熟知的80.8080.8081等服务.因为大部分的服务都是http请求访问协议,那有时候需要用到TCP协议,如果来实现均衡呢? 默认nginx不 ...