首先在开始介绍之前,我们得先说明一下AOP跟Log4J是什么? AOP为Aspect Oriented Programming的缩写,译为:面向切面编程.是Spring的核心之一.它的最主要的作用是用来弥补OOP(面向切面编程思想)的不足,让我们的每一个类都可以专心的去做他们应该做的事情.
在我们Java的三层结构中,我们所熟知的web层是用来接收页面请求参数,传递参数给service层,响应数据给页面.service层是用来接收web层的参数,做业务逻辑处理,dao层主要是用来与数据库进行交互.如果我们遵循OOP的编程思想来进行来发,那么我们将会面临以下几个窘境:1.web层我们写不了日志了. 2.service层我们写不了事务了.所以spring给我们提供了AOP这样一个思想,他可以很好的弥补OOP的不足,在不改变源代码的基础之上对源代码进行增强.这样的话我们就可以在不修改web层以及service层的前提下动态地给他们添加日志输出以及事务的管理.具体的AOP这里就不赘述了,可以参考如下:http://blog.csdn.net/moreevan/article/details/11977115/.
关于Log4J的话我就不赘述了,可以参考如下:http://www.cnblogs.com/crazyacking/p/5456347.html
这里我写举一个日志的例子,以前我们的写法是这样的:
[Java] 纯文本查看 复制代码 * 添加商品
*
* */
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Void> saveItem(Item item, @RequestParam("desc") String desc) {
try {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("新增商品! item = {},desc = {}", item, desc);
}
// 保存商品
this.itemService.saveitem(item, desc);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("新增商品成功! item = {}", item);
}
// 201
return ResponseEntity.status(HttpStatus.CREATED).build();
} catch (Exception e) {
LOGGER.error("新增商品出错! item = " + item, e);
}
// 500
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
在这里我们可以看到一个完整的日志代码,它的代码量是比较庞大的(有的同学说:这才几行代码),这仅仅是一个方法,在企业的真是开发中,想这样的方法会有成千上万个,那这样的话每个方法加上这些代码,那个量就比较吓人了.所以我们采用了如下的方式去提高我们代码的复用性:
首先我们在项目工程中的src目录中加入log4j.properties,内容如下:
[Java] 纯文本查看 复制代码 log4j.rootLogger=WARN, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/usr/local/Cellar/tomcat@7/7.0.77/libexec/logs/example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
接下来我们要编写一个切面,用来存放我们公共的日志代码:
[Java] 纯文本查看 复制代码 package cn.itcast.manage.web.aspect;
/**
* @author 作者 SY:
* @version 创建时间:2017年7月28日 下午2:17:08
* 类说明
*/
import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Aspect {
//获取日志工厂
private static final Logger logger = LoggerFactory.getLogger(Aspect.class);
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
StringBuffer sb = new StringBuffer();
try{
Object result = joinPoint.proceed();
return result;
}catch(Exception e){
sb.append("开始方法:"+joinPoint.getTarget().getClass() + "." + joinPoint.getSignature().getName()+ "() ");
sb.append("错误信息如下:["+e.getMessage()+"]");
logger.error(sb.toString());
}
return "error";
}
}
上面这个类,主要用到了aspectj中的ProceedingJoinPoint,支持的是<aop:around />。
类写完了,但是spring配置文件applicationContext.xml还没有修改,所以修改配置文件如下: [Java] 纯文本查看 复制代码
<!-- 配置日志拦截 -->
<bean id="Aspect" class="cn.itcast.manage.web.aspect.Aspect"></bean>
<aop:config proxy-target-class="true">
<aop:aspect id="logAspectSYS" ref="Aspect">
<aop:around method="invoke" pointcut="execution(public * cn.itcst.manage.web.controller..*.*(..))" />
</aop:aspect>
</aop:config>
至此我们所有的代码编写完毕,程序运行之后,会自动在你系统的以下路径生成一个example.log文件:/usr/local/Cellar/tomcat@7/7.0.77/libexec/logs/example.log
以上内容仅供大家参考.
|