如何在回溯配置之前实例化一个注入的类(使用Spring)

时间:2012-07-10 22:13:27

标签: spring configuration logback applicationcontext

我使用spring将一个类注入到我的PropertyDefiner实现中,该实现将用于帮助在logback.xml文件中设置一些属性(通过dynamic property loading)。

我希望在配置logback之前加载并实例化此类。有关如何做到这一点的任何想法?

3 个答案:

答案 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但可能具有不同属性的其他应用程序。这些属性是从数据库中提取的,也可能因环境而异。