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. JavaWeb框架SSH_Struts2_(三)

    1. Struts2的拦截器(使用拦截器实现权限控制) 拦截器简介 拦截器概述 拦截器工作原理 拦截器的配置 Struts2的内建拦截器 内建拦截器的介绍 内建拦截器的配置 自定义拦截器 实现自定义拦 ...

  2. 【魅族Pro7】——BootStrap/JQuery/Canvas/PHP/MySQL/Ajax爬坑之项目总结(一)

    前言:这个项目是我们小组团体合作完成的学习项目,项目使用魅族GUI设计和图片素材,响应式重构Pro7官网的首页.子页.商城及购物车,并加入一些创新.我主要负责的是[画屏子页]的项目,这里作为温故知新, ...

  3. input type="radio" 赋值问题

    之前项目中 后台传值 然后赋给单选input   在网上找了好久,现在有时间了,整理一下  ,方便以后有人会用到. $('radio[name="sex"][value'" ...

  4. CNCC2017中的深度学习与跨媒体智能

    CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...

  5. Error parsing column 8 (IsRecommended=0 - SByte) Dapper查询mysql数据库可空的tinyint(1)一个错误

    出错条件: 1.实体属性为bool?类型 2.对应字段为可空的tinyint(1)类型 3.该字段查询结果内即含有null,又含有正常值 google答案,两种建议: 1.修改sql语句,直接cast ...

  6. LVS+keepalived快速搭建测试环境

    #LVS+keepalived快速搭建测试环境 #LVS+keepalived快速搭建测试环境 #centos6 X64 # LVS 负载均衡模式:DR(直接路由) 192.168.18.31 mas ...

  7. 基于 HTML5 Canvas 的 3D 碰撞检测

    这是公司大神写的一个放官网上给用户学习的例子,我一开始真的不知道这是在干嘛,就只是将三个形状图元组合在一起,然后可以同时旋转.放大缩小这个三个图形,点击"Animate"就能让中间 ...

  8. Spring Cloud Eureka服务Demo级搭建

    仅用于个人备忘,有错误之处还请文明指出,3Q 开发环境以及工具:Windows.JDK8.STS 1.新建SpringBoot工程作为Eureka Server                    ...

  9. PHP7源码安装MongoDB和MongoDB拓展

    一.安装MongoDB 1.创建mongodb用户组和用户 groupadd mongodb useradd -r -g mongodb -s /sbin/nologin -M mongodb 2.下 ...

  10. Android Toolbar 标题居中及字体样式自定义

    首先找到 toolbar 所在xml布局文件,将toolbar控件放置在一个相对布局(RelativeLayout)中,然后设置toolbar的title为空(随便打几个空格即可): 然后在 tool ...