在Spring MVC Web应用程序中,我在配置文件中配置了一个bean:
在服务类中,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);
然而,我遇到的问题是对象被初始化的顺序.这些属性正在初始化,但看起来在Spring从属性文件中准备好它们之前就发生了System.setProperty调用.
我已经尝试了几个解决方案,但似乎在从属性文件中读取值并调用System.setProperty的调用之前,实例化了CallbackService对象.
最终正在读取属性文件,因为我可以看到值,如果我从其中一个@Controller方法访问它们.问题是初始化属性并且实例化CallbackService实例的点.
经过几个小时的谷歌搜索,我尝试了以下解决方案,但没有似乎在CallbackService实例的初始化/实例化之前填充系统属性
>实现InitiazingBean并在其中设置系统属性
afterPropertiesSet()方法.
>实现ApplicationListener并在onApplicationEvent()方法中设置系统属性.
>为XML中的CallbackService bean定义设置lazy-init = true.
>按照此处所述设置系统属性Set System Property With Spring Configuration File
上面的第4点似乎是我想要的,但是当我将以下(我需要的三个属性)添加到我的上下文文件时,我没有看到任何差异.
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
/super/secret/jaas.conf
如何确保在执行对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);
}
}
下一个,
或者,您可以使用@DependsOn注释:
@Component
@DependsOn("systemPropertiesInitializer")
class CallbackService {
// implementation omitted
}
标签:java,spring-mvc,spring,configuration,java-ee
来源: https://codeday.me/bug/20190625/1286561.html