将 Spring Bean 分配给不受 Spring 管理的田地



我有一个由Spring管理的配置对象。我们将该对象称为"配置对象"。该对象包含的配置我还希望通过委派在我使用"new"运算符实例化的对象中访问。我们将这些对象称为"用户对象"。那么是否可以接受将配置对象作为参数传递给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();
    }
}

此致敬意

亨克

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

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

或者创建类来获取 Spring 上下文,使用 ApplicationContextAware:

@Component
public class SpringContext implements ApplicationContextAware {
   private static ApplicationContext context;
   public static UserService getUserService() {
       return (UserService)context.getBean("userService");
   }
   @Override
   public void setApplicationContext(ApplicationContext context) throws BeansException {
       // store ApplicationContext reference to access required beans later on
       SpringContext.context = context;
   }
}

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

我建议在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);
   }
}

最新更新