TinyFrame再续篇:整合Spring AOP实现日志拦截
上一篇中主要讲解了如何使用Spring IOC实现依赖注入的。但是操作的时候,有个很明显的问题没有解决,就是日志记录问题。如果手动添加,上百个上千个操作,每个操作都要写一遍WriteLog方法,工作量的巨大是可想而知的,更别说还有用户验证这块了。所以说,解决这种问题的方法最好是进行类的横切,OK,让我们进入正题吧。
首先,在解决方案中新建一个名称为BookStore.AOP的类库项目,然后向其中添加IAdvice并继承自IMethodInterceptor接口和IDisposable接口。
然后定义三个方法:
void Initializement();
void BeforeCall(IMethodInvocation invocation);
void AfterCall(IMethodInvocation invocation);
具体代码如下:
1: using System;
2: using AopAlliance.Intercept;
3:
4: namespace BookStore.AOP
5: {
6: public interface IAdvice : IMethodInterceptor, IDisposable
7: {
8: void Initializement();
9: void BeforeCall(IMethodInvocation invocation);
10: void AfterCall(IMethodInvocation invocation);
11: }
12: }
其中Initializement方法主要提供初始化行文;BeforeCall方法主要是在函数执行前触发;AfterCall方法主要是在函数执行后触发。
建立好这个接口之后,新建一个LogAdvice类,继承自刚刚建立的IAdvice接口,并添加如下代码:
1: using System;
2:
3: namespace BookStore.AOP
4: {
5: /*
6: 请在需要消费AOP的地方添加对BookStore.AOP的引用,否则会出现错误。
7: */
8: public class LogAdvice:IAdvice
9: {
10: public LogAdvice()
11: {
12: Initializement();
13: }
14:
15: private log4net.ILog log;
16:
17: public void Initializement()
18: {
19: log4net.Config.XmlConfigurator.Configure();
20: log = log4net.LogManager.GetLogger(typeof(LogAdvice));
21: }
22:
23: public void BeforeCall(AopAlliance.Intercept.IMethodInvocation invocation)
24: {
25: log.Info(string.Format("调用函数开始:{0}", invocation.Method.Name));
26: }
27:
28: public void AfterCall(AopAlliance.Intercept.IMethodInvocation invocation)
29: {
30: log.Info(string.Format("调用函数结束:{0}", invocation.Method.Name));
31: }
32:
33: public object Invoke(AopAlliance.Intercept.IMethodInvocation invocation)
34: {
35: try
36: {
37: BeforeCall(invocation);
38: object resultObj = invocation.Proceed();
39: AfterCall(invocation);
40: return resultObj;
41: }
42: catch (Exception ex)
43: {
44: log.Error(string.Format("调用函数错误:{0},{1},{2}", invocation.Method.Name, ex.Message, ex.StackTrace));
45: return null;
46: }
47: }
48:
49: public void Dispose()
50: {
51:
52: }
53: }
54: }
由于这里的日志记录,我采用了Log4net来进行配置,所以不懂的同学,可以参考我之前的文章Log4Net使用方法小记来进行。
需要说明一点的是,在BeforeCall函数,AfterCall函数,Invoke函数中,我们得到的传入参数都是AopAlliance.Intercept.IMethodInvocation,通过这个参数,我们可以拦截用户当前请求的是什么函数,什么类型等等,非常方便。需要特别注意的是,在Invoke方法中,程序调用invocation.Proceed来拦截函数的执行,这也就是所谓的方法横切操作。
写到这里,我们的编码工作算是完成了,下面来开始配置AOP横切。
打开BookStore.RestService项目,双击Web.config配置文件,新添加如下的节点段落,名称分别为BookRepositoryAOP以及LogTraceAroundAdvice:
1: <!--Spring Config Node-->
2: <spring>
3: <context>
4: <resource uri="config://spring/objects"/>
5: </context>
6: <objects xmlns="http://www.springframework.net">
7: <!--without aop-->
8: <object name="BookRepository" type="BookStore.Data.BookRepository, BookStore.Data" />
9:
10: <!--with aop-->
11: <object name="BookRepositoryAOP" type="Spring.Aop.Framework.ProxyFactoryObject" >
12: <property name="Target">
13: <object type="BookStore.Data.BookRepository, BookStore.Data" />
14: </property>
15: <property name="InterceptorNames">
16: <list>
17: <value>LogTraceAroundAdvice</value>
18: </list>
19: </property>
20: </object>
21: <!--Advices-->
22: <object id="LogTraceAroundAdvice" type="BookStore.AOP.LogAdvice, BookStore.AOP"></object>
23: </objects>
24: </spring>
其中名称为BookRepositoryAOP的节点表明当前采用AOP方式进行,横切的目标是BookStore.Data.BookRepository;横切的处理是BookStore.AOP.LogAdvice。配置好后,一定不要忘记添加对BookStore.AOP项目的引用。
这之后,打开BookService类,修改构造初始化为刚刚配置的节点:
1: public BookService()
2: : base()
3: {
4: bookRepository = (IBookRepository)applicationContext["BookRepositoryAOP"];
5: }
然后执行,我们就可以看到拦截的日志消息了,如果执行的时候,出现错误,还能够将错误信息捕捉,是不是感觉有了AOP,腰不酸了,腿不痛了的感觉呢?
这节就到这里了,下节主要讲解用户验证这块,也是利用横切来进行。
这里允许我白话一下:接口这东西在小项目中根本用不到,但是在大项目中,是必不可少的。IOC,AOP全靠它了。并且模块与模块之间交互,利用接口来规范,大大降低了耦合度,真好啊。
TinyFrame再续篇:整合Spring AOP实现日志拦截的更多相关文章
- Spring AOP进行日志记录,管理
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
- Spring AOP统一日志 全量日志
Spring AOP 切面@Around注解的具体使用 lichuangcsdn 2019-02-19 23:21:36 63936 收藏 61分类专栏: Spring 文章标签: Spring AO ...
- Spring AOP 完成日志记录
Spring AOP 完成日志记录 http://hotstrong.iteye.com/blog/1330046
- Spring AOP进行日志记录
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
- TinyFrame尾篇:整合Spring AOP实现用户认证
创建Manager用户验证表 这一篇主要讲解使用AOP对用户操作进行验证,如果通过验证,则继续执行,反之,则不能执行.其思想和上一篇完全一致. 由于需要用到用户认证,所以我们新建一个Manager实体 ...
- spring aop实现日志收集
概述 使用spring aop 来实现日志的统一收集功能 详细 代码下载:http://www.demodashi.com/demo/10185.html 使用spring aop 来实现日志的统一收 ...
- 使用Spring AOP 实现日志管理(简单教程)
有时候,我们在做项目时会遇到这样的需求: 给XXX.java中的所有方法加上指定格式的日志输出. 针对这种指定类.或者指定方法进行共性操作的功能,我们完全可以使用Spring AOP来实现. 本文使用 ...
- Spring AOP原理及拦截器
原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...
- Spring AOP的日志记录
现在的项目是Spring+MyBatis,前段时间项目经理让我干了一个活,就是给所有的controller里的所有方法加上日志记录的代码,其实没有多少,也就300来个方法,也没有抱怨什么,一边打着瞌睡 ...
随机推荐
- 敏捷开发--scrum
1. 请简述一下什么是敏捷开发(Agile Development),以及什么是持续集成. 敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个 ...
- Java是如何处理别名(aliasing)的
什么是Java别名(aliasing) 别名意味着有多个别名指向同一个位置,且这些别名有不同的类型. 在下面的代码例子中,a和b是两个不同的名字,有不同的类型A和B,B继承A B[] b = new ...
- ORA-00988: missing or invalid password(s)
创建账号或修改账号密码时有可能会遇到ORA-00988: missing or invalid password(s),那么什么情况下会遇到这种错误呢? 一般是因为密码的设置不符合命名规范: 1:密码 ...
- Protocol 编码的三种常用方式
1.使用固定长度 2.使用固定长度的请求头,请求头中说明了body的长度. 例如HTTP 协议: http请求协议: http 响应协议: 3.使用界定符.例如有很多基于text(文本)协议都会在每个 ...
- Tomcat:bio nio 的设计
BIO 由Acceptor接收Socket,将其转交给Worker来处理. NIO 由Acceptor接收Socket,将其转交给Poller来轮询处理.Poller再将可处理的Socket交给Wo ...
- c# bass入门学习
据说bass挺好用的,所以又搞了个音乐播放器 这是参考了别人的bass教学结合自己的理解写的bass操作类 public class BassHelper { private static BassH ...
- Mysql 创建用户 授权
一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...
- spring管理bean
- expr
将变量的值当作数值处理而不是字符串,shell支持6种算术运算符:加+, 减-,乘\*,除/, 取余%, 括号\( \),每种算术运算符的两边都要有空格 $echo "Res = $(exp ...
- x01.os.13: 文件系统
停了两天电,忽然得空闲.找来破吉他,已然不成弦. 丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...