Spring使用aop将日志(包括异常信息)输入到日志文件
最近把刚开发的代码部署到服务器,因为使用的是本地web和Junit测试接口,那是没问题的,但其实接口是给安卓用的,他那边一测试就报错。由于之前没有把异常信息输入到日志文件(第一次把单独开发的后台部署到远程服务器,没有经验),所以没法查看哪里出错了。今天才想到使用日志把异常日志使用普通的log4j记录日志,使用普通的日志记录信息,需要在每个方法要使用日志的都要使用这句话private static final Log log = LogFactory.getLog(JYLog.class);这样破坏了代码的完整性,而且日志代码的可重复使用性太差。所以就想像配置权限过滤器一样,配置日志aop。
首先介绍一下aop的知识吧。(第一次真正接触aop是在配置权限管理的时候,因为本人不喜欢jsp,把java代码嵌套到jsp中,总觉得这没有真正做到MVC的思想,代码模块化不够,扯远了)
注,一下有些是从别人的地方copy过来的,只是添加个人理解而已
AOP(Aspect-Oriented Programming,面向切面编程)
切面(Aepect):横切关注点(跨越应用程序多个模块的功能)被模块化的对象;
通知(Advice):切面必须要完成的工作;
目标(Target):被通知的对象;
代理(Proxy):像目标对象应用通知之后创建的对象;
连接点(Joinpoint):程序执行的某个特殊位置,如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;想对点表示的方位。
切点(pointcut):每个类都拥有多个连接点,即连接点是程序类中客观存在的事务;
AOP通过切点定位到特定的连接点。
AOP的主要编程对象是切面(aopect),而切面模块化横切关注点。
在应用AOP编程时,仍需要定义公共功能,但可以明确这个功能在哪里,以什么方式应用,并且不必修改受影响的类,这样的话横切关注点就被模块化到特殊的对象(切面)里。
AOP的好处:
每个事物逻辑位于一个位置,代码不分散,便于维护和升级;
业务模块更简洁,值包含核心业务代码
两种方式使用aop:一是使用aspectj注解,二是基于xml配置的aop
1、基于AspectJ注解
(1)Maven引入依赖包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.1</ve