Spring:在创建任何 bean 之前初始化属性

Posted

技术标签:

【中文标题】Spring:在创建任何 bean 之前初始化属性【英文标题】:Spring : Initialization of properties before any bean creation 【发布时间】:2018-11-04 00:21:06 【问题描述】:

我的项目结构如下-

外观 -> 服务-> DAO

在 DAO 层中,当初始化 bean 时,会从属性文件中注入许多依赖项。因此,必须先读取属性文件,然后必须创建剩余的 dao bean。当应用程序启动时,它会给出一个错误,即 Spring 无法解析占位符。

DAO-application-context.xml 就像-

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="prop">
        <value>app.properties</value>
    </property>
</bean>

<import resource = "a-dao.xml" />
<import resource = "b-dao.xml" />
<import resource = "c-dao.xml" />

现在在所有子应用程序上下文(即 a-dao 等)中,我们有 -

<bean ....>
  <property name = "xyz">
    <value>$appValue<value/>
  </property>
<bean>

收到的错误是 appValue 无法解析。我认为这可能是由于 bean 创建的顺序不正确。但是,相同的配置正在另一个更大的项目中运行。

我已经检查了Order of Spring Bean Initialization,但实施该解决方案是不可行的。有没有其他办法?

【问题讨论】:

这个项目你用的是哪个版本的spring? 我使用的是 Spring 4.17 【参考方案1】:

Reg this Block of Configuration,属性prop好像不对

<bean 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="prop">
    <value>app.properties</value>
</property>
</bean>

根据Spring documentation 您可以使用属性 locationlocations 来设置属性文件的一个或多个值。

所以代码应该重构为

<bean 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
    <value>app.properties</value>
</property>
</bean>

【讨论】:

以上是关于Spring:在创建任何 bean 之前初始化属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解 - 生命周期属性赋值自动装配

Spring_Bean的作用域---和使用外部属性文件

Spring Boot - 在初始化 DataSource bean 之前运行自定义代码

spring bean id和bean name的区别

Spring5AOP——BeanPostProcessor

spring-bean初始和销毁之前之后的操作