Java 配置Spring以设置系统属性';在'之前;一个豆子是初始化的

Java 配置Spring以设置系统属性';在'之前;一个豆子是初始化的,java,spring,jakarta-ee,spring-mvc,configuration,Java,Spring,Jakarta Ee,Spring Mvc,Configuration,在Spring MVC web应用程序中,我在配置文件中配置了一个bean,如下所示: <bean class="com.callback.CallbackService"/> 上面显示的CallbackService通过进行以下三个调用(目前无法更改)来获取其连接属性: 声明CallbackService实例的服务类可以通过读取属性文件访问上述三个值,如下所示: @Autowired CallbackService service @Value("${user}") prote

在Spring MVC web应用程序中,我在配置文件中配置了一个bean,如下所示:

<bean class="com.callback.CallbackService"/>
上面显示的CallbackService通过进行以下三个调用(目前无法更改)来获取其连接属性:

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

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

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

@Value("${connection}")
protected String connectionString;  
System.setProperty("user", userName);
System.setProperty("password", password);
System.setProperty("connectionURL", connectionString);
我需要为CallbackService设置属性的全部内容是设置系统属性(初始化后),如下所示:

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

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

@Value("${connection}")
protected String connectionString;  
System.setProperty("user", userName);
System.setProperty("password", password);
System.setProperty("connectionURL", connectionString);
然而,我遇到的问题是对象初始化的顺序。属性正在初始化,但似乎System.setProperty调用发生在Spring从属性文件准备好它们之前

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

属性文件最终被读取,因为如果我从@Controller方法之一访问它们,我可以看到这些值。问题在于初始化属性和插入CallbackService实例的点

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

  • 实现
    InitiazingBean
    并在
    afterPropertieSet()
    方法
  • 实现
    ApplicationListener
    并在
    onApplicationEvent()
    方法中设置系统属性
  • 为XML中的CallbackService bean定义设置
    lazy init=true
  • 按此处所述设置系统属性
  • 上面的第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>
    
    
    /super/secret/jaas.conf
    
    如何确保在执行对
    System.setProperty
    的调用之前从属性文件中读取这些值,并且只有这样才能实例化CallbackService实例


    谢谢

    您可以让
    CallbackService
    另一个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);
          }
     }
    
    其次,


    谢谢,我现在正在尝试。如果SystemPropertieInitializer没有无参数构造函数,它将如何实例化?您的意思是如果它确实有无参数构造函数(或者根本没有构造函数)?只需使用
    @Value
    注释分别初始化每个字段,然后就可以在init方法上使用注释,该方法依次调用
    System.setProperties(…)
    方法。这里有很多详细信息,但问题与问答格式不符。。。问题并没有在开头明确说明。