将Spring bean分配给不受Spring管理的字段

时间:2019-01-09 09:26:42

标签: java spring

我有一个由Spring管理的配置对象。我们将该对象称为“ ConfigurationObject”。我还希望通过委托使该对象包含的配置在我使用“ new”运算符实例化的对象中进行访问。让我们将这些对象称为“ UserObject”。 然后可以将configurationObject作为参数传递给UserObject的构造函数,然后将其分配给不受Spring管理的常规私有字段吗?这样我就可以使用ConfigurationObject从UserObject返回配置。有关代码中的故事,请参见下文。

@Configuration
public class ConfigurationObject {

   private final String configItem;

   public ConfigurationObject(@Value("${config.item}") final String configItem){
        this.configItem = configItem;
   }

   public String getConfigItem() {
     return configItem;
  }
}

public final class UserObject {

    private ConfigurationObject configurationObject;
    /* other properties */

    public UserObject(final ConfigurationObject configurationObject) {
       this.configurationObject = configurationObject;
    }

    public String getConfigItem(){
      return configurationObject.getConfigItem();
    }
}

最诚挚的问候,

Henk

2 个答案:

答案 0 :(得分:0)

您可以使用KeyedBroadcastProcessFunction中的上下文获取Spring类:

ApplicationInitializer

或创建类以使用ApplicationContextAware获取Spring上下文:

ApplicationInitializer.getAppContext().getBean(ConfigurationObject.class);

答案 1 :(得分:0)

是的。这是一个非常有效的用例。当我需要创建一个对象,该对象的某些属性是在运行时确定的时,我经常这样做。

我建议在ConfigurationObject上创建工厂方法来创建UserObject

@Configuration
public class ConfigurationObject {

   private final String configItem;

   public ConfigurationObject(@Value("${config.item}") final String configItem){
        this.configItem = configItem;
   }

   public String getConfigItem() {
     return configItem;
  }

   public UserObject createUserObject(){
     return new UserObject(this);
   }
}