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