java调用spring管理的bean——spring的使用

最近项目要搭建一个日志平台,没有现成的思路。自己就上网去查,了解log4j搭建日志系统。可以输出在控制台、文件(logfile)、也可以输出到数据库。输出到数据库可以用log4j的配置,也可以继承org.apache.log4j.AppenderSkeleton;实现输出。但是实现类,不能由spring注入baseDao.这是个很烦恼的问题,于是想用一个独立的jdbc解决这个问题,但是这又似乎太变态了。哎……自己快要写完了,但是还是想放弃,因为这是让人很难受的代码,一个项目的代码应该是一个完美的系统,但这跟我想的完美太远了。后来突然想到了java调用spring管理的bean,这个问题就水到渠成的解决了。

实现代码如下:

package com.yt.service;

import java.sql.SQLException;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.Level;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.yt.base.BaseDao;
import com.yt.model.AbstractLog;
import com.yt.model.DBLog;

/**
 * @ClassName: DBAppender
 * @Description: log4j输出到数据库
 * @Author He Rongbing
 * @Date Nov 18, 2010 10:28:33 AM
 */
public class DBAppender extends AppenderSkeleton {
 private  BaseDao baseDao = null;//从spring context中得到,这里用单例
 public static HttpServletRequest request = null;//静态的,从外面传过来。
 @Override
 protected void append(LoggingEvent arg0) {
  AbstractLog log = (AbstractLog) arg0.getMessage();
  getBaseDao();
  if (log != null&&baseDao!=null) {
   HashMap<String, Object> hm = new HashMap<String, Object>();
  hm.put("RZXX", log.getLogMSG());
   hm.put("RZLX", log.getLogType());
   hm.put("CLL", log.getOpeClass());
   hm.put("CZRY", log.getOpeYH());
   hm.put("GNMC", log.getOpeName());
   hm.put("YXJG", log.getOpeResult());
   hm.put("CZSJ", new Timestamp(arg0.timeStamp));
   hm.put("RZJB",arg0.getLevel().toString() );

   if (log instanceof DBLog) {
    DBLog dbLog = (DBLog) log;
    hm.put("CZLX", dbLog.getOpeType());
   } else {
    hm.put("CZLX", "");
   }

   try {
    baseDao.executeInsert("xt.insertLog", hm);
   } catch (SQLException e) {
    System.out.println("**************写系统日志表失败!**************");
    e.printStackTrace();
   }
  }
 }

 public void close() {
  closed = true;
 }

 public boolean requiresLayout() {
  return false;
 }
 /**
  * @Title: getBaseDao
  * @Description: 得到baseDao,从spring配置中得到,这里需要一个HttpServletRequest
  * @Author:He Rongbing
  */
 private  void getBaseDao() {
  if (baseDao==null){
   ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
   baseDao  = (BaseDao)ctx.getBean("baseDao");
  }
 }

}
java调用spring管理的bean,在一些基础类和接口类的编写中会非常有用,因为许多类不在我们的spring管理范围内。这里特意总结,算是对自己思考的肯定,自己总结以后一定用的着,也是跟朋友们交流。

猜你喜欢

转载自blog.csdn.net/jiabeis/article/details/6018879
今日推荐