配置Spring以在初始化bean之前设置系统属性

时间:2013-01-06 18:37:47

标签: java spring java-ee spring-mvc configuration

在Spring MVC Web应用程序中,我在配置文件中配置了一个bean:

<bean class="com.callback.CallbackService"/>

在服务类中,bean被初始化,如下所示:

@Autowired
CallbackService service

上面显示的CallbackService通过进行以下三次调用来获取其连接属性(现在无法更改):

System.getProperty("user");
System.getProperty("password");
System.getProperty("connectionURL");

声明CallbackService实例的服务类可以通过读取属性文件来访问上述三个值,如下所示:

@Value("${user}")
protected String userName;

@Value("${password}")
protected String password;

@Value("${connection}")
protected String connectionString;  

我需要设置Call​​backService的属性是设置系统属性(在初始化之后),如下所示:

System.setProperty("user", userName);
System.setProperty("password", password);
System.setProperty("connectionURL", connectionString);

然而,我遇到的问题是对象被初始化的顺序。这些属性正在初始化,但看起来在Spring从属性文件中准备好它们之前就发生了System.setProperty调用。

我尝试了几种解决方案,但似乎在从属性文件读取值并调用System.setProperty调用之前,实例化了CallbackService对象。

最终正在读取属性文件,因为我可以看到值,如果我从其中一个@Controller方法访问它们。问题是初始化属性并且实例化CallbackService实例的点。

在谷歌搜索几个小时后,我尝试了以下解决方案,但似乎没有在CallbackService实例的初始化/实例化之前填充系统属性

  1. 实施InitiazingBean并在其中设置系统属性 afterPropertiesSet()方法。
  2. 实施ApplicationListener并在onApplicationEvent()方法中设置系统属性。
  3. 在XML中为CallbackService bean定义设置lazy-init=true
  4. 按此处Set System Property With Spring Configuration File
  5. 所述设置系统属性

    上面的第4点似乎是我想要的但是当我将以下(我需要的三个属性)添加到我的上下文文件时,我没有看到任何区别。

    <bean id="systemPrereqs"
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject" value="#{@systemProperties}" />
        <property name="targetMethod" value="putAll" />
        <property name="arguments">
            <!-- The new Properties -->
            <util:properties>
                <prop key="java.security.auth.login.config">/super/secret/jaas.conf</prop>
            </util:properties>
        </property>
    </bean>
    

    如何确保在执行对​​System.setProperty的调用之前从属性文件中读取值,然后才能实例化CallbackService实例?

    由于

1 个答案:

答案 0 :(得分:4)

您可以让CallbackService depend on另一个初始化系统属性的bean,例如

 class SystemPropertiesInitializer {

      SystemPropertiesInitializer(@Value("${user}") String userName, 
              @Value("${password}") String password, 
              @Value("${connection}" String connectionString) {

          System.setProperty("user", userName);
          System.setProperty("password", password);
          System.setProperty("connectionURL", connectionString);
      }
 }

接下来,

 <bean id="systemPropertiesInitializer" class="com.callback.SystemPropertiesInitializer"/>
 <bean class="com.callback.CallbackService" depends-on="systemPropertiesInitializer"/>

或者,您可以使用@DependsOn注释:

 @Component
 @DependsOn("systemPropertiesInitializer")
 class CallbackService { 
     // implementation omitted
 }