2013-04-25 83 views
0

我有一个工具类,我想在应用程序在Spring MVC中启动时进行初始化。所以我正在实施InitializingBean。现在我必须为它创建一个对象并将它保存在Application范围中,以便我可以在任何地方访问同一个实例。但我无法掌握这一点。春天在应用程序上下文中设置对象mvc

这里是我的尝试:

public class DashboardInitializer implements InitializingBean, ApplicationContextAware { 

    private ApplicationContext mApplication; 

    @Override 
    public void afterPropertiesSet() throws Exception { 

     initializeConfigurationUtil(); 

     ConfigurationUtil util = ConfigurationUtil.getInstance(); 

     /* Save the util to application scope */ 

    } 

    @Override 
    public void setApplicationContext(ApplicationContext pApplication) throws BeansException { 
     this.mApplication = pApplication; 
    } 
} 

这是正确的做法或有更好的方法来做到这一点?

回答

3

我认为你需要简化这一点。

您希望在加载应用程序上下文后初始化实用程序类,但是您还希望util类位于应用程序上下文中?

似乎util类在应用程序上下文中配置了一些依赖项对象,而util类又是应用程序上下文中某些类的依赖项。

如果你可以以bean的形式表达这些依赖关系(util是一个bean,注入它的依赖bean,而需要util的bean注入util),Spring将确保util的所有依赖首先被初始化,然后util被初始化,然后它被注入到需要util的类中。

你不应该尝试添加一些东西到初始化的上下文..它是不可能的。

如果无法将util及其依赖项表达为bean,那么也可以采用以下方法: 1.将util配置为应用程序上下文中的bean,添加一个不执行任何操作的默认构造函数。所以这个对象会被创建,但是在加载spring上下文时没有被初始化。

  1. ApplicationContextAware实现你有,修改setApplicationContext方法。从上下文获取您之前配置的util bean。

  2. 现在你可以初始化(执行一些你想要执行的代码)util实例,只要确保你不要试图将bean重新分配给其他util实例。

希望这会有所帮助。

1

您可以使用@postconstruct注释方法在应用程序初始化后立即执行业务逻辑。并且可以使用占位符在java字段中的config和@Value批注中简单地注入属性。

+0

我检查了'''@ PostConstruct''''。这是在创建控制器对象后为每个控制器调用的。但是,我的逻辑并不是特定于任何控制器,而是特定于应用程序。我的ConfigurationUtil在控制器中使用,所以我必须在应用程序配置完成后才初始化它。所以''''afterPropertiesSet()''''似乎是理想的选择。但是我无法得到如何在应用程序上下文中存储它的实例,这样我就可以在任何地方使用同一个实例。我正在考虑使用'''''''''''''''''''''''这是我的目的的正确选择吗? – divinedragon 2013-04-25 12:41:58

+0

postconstuct不是特定于控制器的 – NimChimpsky 2013-04-25 14:17:21