最近项目要搭建一个日志平台,没有现成的思路。自己就上网去查,了解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管理范围内。这里特意总结,算是对自己思考的肯定,自己总结以后一定用的着,也是跟朋友们交流。
分享到:
相关推荐
初始化后可访问Spring管理的Bean
Spring,Bean调用,事务,AOP,配置详细说明 提升开发效率
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/1479445
普元eos-springbean开发
主要为大家详细介绍了Java类获取Spring中bean的5种方式,感兴趣的小伙伴们可以参考一下
flex使用blazeds与java通信配置说明,包括java使用spring框架,blazeds调用spring bean
1. Spring容器的启动流程 2. 循环依赖 3. Spring 中Bean的创建 4. Spring 方法xmind脑图
Spring 大量引入了Java 的Reflection机制,通过动态调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入机制的实现基础。org.springframework.beans包中包括了这些核心...
主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用了SpringContextHolder方便在自定义线程中调用spring已经实例的bean,如使用service 使用了urlrewrite filter进行地址重写,实现伪静态页面 使用了sitemesh对网页进行布局和修饰 使用了loginFilter对访问进行...
·调用实例工厂方法创建bean 时,必须使用factory-bean 属性来确定工厂bean。 而静态工厂方法则使用class 元素确定静态工厂类。 其相同之处如下: ·都需使用factory-method属性指定产生bean 实例的工厂方法。 ...
来源于sofaboot
(3)如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。 (4)如果Bean实现了BeanFactoryAware接口,则Spring调用setBeanFactory()方法传入当前工厂实例的引用。 (5)...
主要介绍了Spring Boot中Bean定义方调用方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2292388
1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 1.2 我对AOP的理解 1.3 Spring开闭原则的表现-BeanPostProcessor的扩展点-1 1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成...
2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发环境eclipse,jdk1.6。使用第三方jar包有:jdom.jar(用于解析xml文件),junit-4.4.jar...
Spring实现远端调用的方案有很多种,你知道它们之间的优劣差异吗? Spring ACEGI安全框架在用户验证和授权机制的实现上有何过人之处? 如何在Spring的基础上进行扩展开发? 你是否曾经也有过分析开源软件源...
spring实现远端调用的方案有很多种,你知道它们之间的优劣差异吗? spring acegi安全框架在用户验证和授权机制的实现上有何过人之处? 如何在spring的基础上进行扩展开发? 你是否曾经也有过分析开源软件...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...