我使用spring将一个类注入到我的PropertyDefiner实现中,该实现将用于帮助在logback.xml文件中设置一些属性(通过dynamic property loading)。
我希望在配置logback之前加载并实例化此类。有关如何做到这一点的任何想法?
答案 0 :(得分:1)
如果你在Spring中使用注释,那么通过标记你将作为@Component注入的类(即依赖项)然后在PropertyDefiner实现中使用@Autowired来做到这一点很方便。这可确保首先实例化第一个类。 http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s12.html
使用实例初始化程序块http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
可以实现您需要的任何其他初始化答案 1 :(得分:1)
我不知道目前是否可以优雅地完成这项工作(2012-07)。但是,LOGBACK-719要求支持注射。
如果你的bean工厂实现了AutowireCapableBeanFactory,给定Spring Applicaton上下文,你可以调用autowireBean(Object existingBean)来自动装配bean。这是一个暂定的实施:
class Your.PropertyDefiner implements PropertyDefiner, LifeCycle {
@Autowired
@Qualifier("myKey")
String myKey;
public void start() {
ApplicationContext appContext = ... somehow get the spring app context
AutowireCapableBeanFactory factory = appContext.getAutowireCapableBeanFactory();
factory.autowireBean(this); // declare victory
}
}
仅当PropertyDefiner实现LifeCycle接口时,才会调用start()
方法。此外,您需要logback版本1.0.7或更高版本。早期版本不会调用start()
。
答案 2 :(得分:1)
我的解决方案导致未实施PropertyDefiner。最初的问题变成了一个问题,即没有来自spring的应用程序上下文来设置动态属性。我不确定为什么,但是在应用程序上下文可用之前,将在稍后的侦听器(在Spring侦听器之后)中调用代码(调用LoggerFactory调用)。我尝试了很多东西,直到我开始研究不同的方法。
我没有使用动态属性,而是创建了一个侦听器(在服务器启动时调用),然后以编程方式使用我想要的属性(通过createAdminNotifyAppender)设置我的appender。
@Override
public void contextInitialized(ServletContextEvent arg0)
{
//Set up the property reader to pull the correct properties
ServletContext context = arg0.getServletContext();
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(context);
propReader = (AppConfigPropertiesReader)appContext.getBean("propertySourcesPlaceholder");
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
createAdminNotifyAppender(lc, propReader);
}
createAdminNotify方法只是设置一个appender并将其添加到日志记录上下文中。 (如果你真的很感兴趣,你可以在这个thread上看到该方法的实现。)
现在我有一个单独的模块化监听器,我可以将其添加到使用logback但可能具有不同属性的其他应用程序。这些属性是从数据库中提取的,也可能因环境而异。