【问题标题】:Auto-wiring Spring constructor arguments from properties file in XML从 XML 中的属性文件自动装配 Spring 构造函数参数
【发布时间】:2014-10-10 12:11:59
【问题描述】:

我正在使用 Spring 自动连接 bean 进行配置。一些参数来自属性文件:

<bean id="mydb" class="myproject.mydb" autowire="constructor">
    <constructor-arg name="host" value="${mydb.host}" />
    <constructor-arg name="db" value="${mydb.db}" />
    <constructor-arg name="user" value="${mydb.user}" />
    <constructor-arg name="password" value="${mydb.password}" />
</bean>

有没有办法根据 bean id 自动连接这些属性,这样我只需要编写以下内容?

<bean id="mydb" class="myproject.mydb" autowire="constructor" />

编辑: 重点是不必明确指定非 bean 构造函数参数。我希望 Spring 自动检查 beanId.constructorArgName 的属性

【问题讨论】:

  • 我终于明白你的期望了。您希望 Spring 猜测他必须为您的 bean mydb 使用 mydb.host 属性。我不知道有这样的功能

标签: java spring


【解决方案1】:

要完全实现您想要的,我认为您需要实现 BeanPostProcessor 并在 postProcessBeforeInitialization 中提供您的自定义接线逻辑(您在其中读取 .properties 文件)。 bean 名称可用于该方法,但存在多个问题。首先是参数名称是not necessarily available at runtime,因此索引可能是更好的选择。第二个是您已经有一个实例化的bean(因此需要存在一个默认构造函数),并且您将实例化另一个,将第一个丢弃,这是浪费。要使用已经存在的实例,您需要通过属性而不是构造函数来连接它,这违反了封装并且不是您所要求的。第三是根本不明显发生了什么。所以,总而言之,你最好完全避免这种情况。

【讨论】:

    【解决方案2】:

    在你的班级 myproject.mydb

     @Autowired
     public mydb(@Value("mydb.host") String host,  ...){...}
    

    【讨论】:

      【解决方案3】:

      根据您的问题,可以将属性值注入构造函数的唯一方法是通过上述 XML 文件或使用 @Value("${some.property}") 注释。

      更多信息请参考this

      【讨论】:

        【解决方案4】:

        使用@Value("property key") 注解。看看例如:http://java.dzone.com/articles/autowiring-property-values

        【讨论】:

          猜你喜欢
          • 2014-09-29
          • 1970-01-01
          • 2013-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多