在 java 中的 bean 中插入 ${xxx} 的值

insert value for ${xxx} in bean in java

我在XML中定义了一个bean like

<bean class="some.class.Clazz">
    <property name="user" value="${user}"/>
</bean>

之后,我想在 java 中插入值,我有这样的代码:

ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("main.xml");
Properties ftpSessionProps = new Properties();
ftpSessionProps.setProperty("user", "first");

StandardEnvironment env = new StandardEnvironment();
env.getPropertySources().addLast(new PropertiesPropertySource("pops", ftpSessionProps));
ctx.setEnvironment(env);
ctx.refresh();
ctx.start();

但它永远行不通...

我尝试添加

<context:property-placeholder />

xml 文件中,它给了我日志:

Could not resolve placeholder 'user' in string value "${user}"

有什么建议吗?或书籍或文章的推荐?

谢谢!

更新

好像class'ConfigurableApplicationContext'不能用新的env刷新。所以我们要慎重选择contextclass。 AbstractRefreshableConfigApplicationContext 可以刷新,你应该只用一个空资源初始化它。并在设置 environment 后手动设置 configLocation

String参数的构造函数自动处理文件失败,因为还没有设置环境

您需要使用 zero-parameter constructor,调用 setConfigLocationsetEnvironment,然后调用 refreshstart

AbstractRefreshableConfigApplicationContext ctx = new ClassPathXmlApplicationContext(); // init empty
Properties ftpSessionProps = new Properties();
ftpSessionProps.setProperty("user", "first");

StandardEnvironment env = new StandardEnvironment();
env.getPropertySources().addLast(new PropertiesPropertySource("pops", ftpSessionProps));
ctx.setEnvironment(env);
ctx.setConfigLocation("classpath:main.xml"); // set the config here
ctx.refresh();
ctx.start();

如果您想填充 "some.class.Clazz" Bean 的 "user" 属性,您可以使用“PropertyPlaceholderConfigurer”,为此您必须使用 属性 文件 locations 作为 attribute.It 的子类,根据系统属性和环境变量解析 ${...} 占位符。

<bean id="dataProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:myproject.properties</value>
                </list>
            </property>
            <property name="ignoreResourceNotFound" value="true" />
            <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${driverClassName}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
</bean>

此 bean 定义将在应用程序类路径下的 myproject.properties 文件中找到 ${driverClassName} 的值。

对应的属性文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschema
username=root
password=1234