动态创建对象的依赖注入的好处

在Spring这样的IoC容器的上下文中,我正在寻找一种方法将一些依赖关系/属性注入到类的实例化中。 并非所有对象的属性都可以使用依赖注入来设置,并且对象是响应应用程序事件而动态创建的。 如果所有依赖可以通过容器注入,那么Spring管理bean将是理想的。

例如,下面定义的类必须注释为@Component (或更专门的注释),以便组件扫描和依赖注入工作。 但它有几个属性( nameattempts ),只能由应用程序代码动态设置,而不是容器。 但是,如果我必须使用endpointrestTemplate (已经由IoC容器管理),通过构造函数或setter方法将它们提供给此对象并不方便。

public class SomeClass {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private String endpoint;

    private String name;
    private int attempts;

    public SomeClass(String name, int attempts) {

        this.name = name;
        this.attempts = attempts;
    }

    // public getter and setter methods
}

由于有一些动态设置的属性,因此我不能使用new关键字来实例化类,并仍然享有DI和IoC的好处。 或者我可以吗?


你可以使用工厂。 如下所示:

public class SomeClass {

  private RestTemplate restTemplate;
  private String endpoint;
  private String name;
  private int attempts;

  public SomeClass(String name, int attempts, RestTemplate restTemplate,
      String endpoint) {
    this.name = name;
    this.attempts = attempts;
    this.restTemplate = restTemplate;
    this.endpoint = endpoint;
  }
}

@Component
public class SomeClassFactory {

  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private String endpoint;

  public SomeClass create(String name, int attempts) {
    return new SomeClass(name, attempts, restTemplate, endpoint);
  }
}

SomeClass instance = someClassFactory.create("beep", 0);

如果我没有误解你,你需要在构造函数中设置值。

您可以从上下文创建bean并设置值:

context.getBean(“beanname”,arg1,arg2 ....);

链接地址: http://www.djcxy.com/p/14395.html

上一篇: Benefit of dependency injection for dynamically created objects

下一篇: How to inject a Mock in a Spring Context