gpt4 book ai didi

java - 配置 Spring 以设置系统属性 'before' 初始化一个 bean

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:26 25 4
gpt4 key购买 nike

在 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;

我需要为 CallbackService 设置属性是设置系统属性(在它们被初始化之后),如下所示:

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

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

我尝试了几种解决方案,但似乎在从属性文件读取值并调用 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

上面的第 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 实例?

谢谢

最佳答案

您可以让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
}

关于java - 配置 Spring 以设置系统属性 'before' 初始化一个 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com