在 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
刷新。所以我们要慎重选择context
class。 AbstractRefreshableConfigApplicationContext
可以刷新,你应该只用一个空资源初始化它。并在设置 environment
后手动设置 configLocation
。
带String
参数的构造函数自动处理文件失败,因为还没有设置环境
您需要使用 zero-parameter constructor,调用 setConfigLocation
、setEnvironment
,然后调用 refresh
和 start
:
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
我在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
刷新。所以我们要慎重选择context
class。 AbstractRefreshableConfigApplicationContext
可以刷新,你应该只用一个空资源初始化它。并在设置 environment
后手动设置 configLocation
。
带String
参数的构造函数自动处理文件失败,因为还没有设置环境
您需要使用 zero-parameter constructor,调用 setConfigLocation
、setEnvironment
,然后调用 refresh
和 start
:
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