Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态创建对象的依赖项注入的好处_Java_Spring_Dependency Injection - Fatal编程技术网

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

Java 动态创建对象的依赖项注入的好处,java,spring,dependency-injection,Java,Spring,Dependency Injection,在诸如Spring之类的IoC容器的上下文中,我正在寻找一种将一些依赖项/属性注入到类的实例化中的方法。并非所有对象的属性都可以使用依赖项注入进行设置,并且对象是动态创建的,以响应应用程序事件。如果所有依赖项都可以通过容器注入,那么Spring管理的bean将是理想的选择 例如,下面定义的类必须注释为@Component(或更专门的注释),以便组件扫描和依赖项注入工作。但是它有两个属性(name和尝试),只能由应用程序代码而不是容器动态设置。但是,如果我必须使用端点和restTemplate(它

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

例如,下面定义的类必须注释为
@Component
(或更专门的注释),以便组件扫描和依赖项注入工作。但是它有两个属性(
name
尝试
),只能由应用程序代码而不是容器动态设置。但是,如果我必须使用
端点
restTemplate
(它们已经由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);

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

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并设置值:


getBean(“beanname”,arg1,arg2….)

如果我没有误解您的意思,您需要在构造函数中设置值

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


getBean(“beanname”,arg1,arg2….)

您可以使用AspectJ,但工厂通常是一个更好的选择。您可以使用AspectJ,但工厂通常是一个更好的选择。我正在尝试确定一种不必设置/注入那些可以直接从容器中注入的属性的好方法,这些属性已经由Spring管理。你是说
SomeClass
可以是一个Spring管理的bean(并用
@Component
注释),我可以按照你建议的方式设置
名称和
尝试数
属性?要使autowire字段工作,SomeClass应该是一个Spring组件:@Component(“SomeClass”)公共类SomeClass{………context.getBean(“someclass”,name,attempts);我正在尝试确定一种好方法,不必设置/注入那些可以直接从Spring管理的容器中注入的属性。你是说
someclass
可以是Spring管理的bean吗(并用
@Component
注释),我可以按照您建议的方式设置
名称
尝试次数
属性?要使autowire字段正常工作,SomeClass应该是spring组件:@Component(“SomeClass”)公共类SomeClass{………..context.getBean(“SomeClass”,名称,尝试次数);我喜欢工厂方法。它要求我对
SomeClass
有一个较长的构造函数方法签名,但我不会直接使用该构造函数,而是使用工厂的
create
方法。我喜欢工厂方法。它要求我对
SomeClass
有一个较长的构造函数方法签名,但我不会直接使用该构造函数,而是使用工厂的
create
方法。