我可以使用 spring @Autowired 依赖注入来构建 class 的多个实例吗?
Can I use spring @Autowired dependency injection to build multiple instances of a class?
我有一个带有 2 个参数的构造函数的 vaadin UI class。它用一些字段构建一条简单的线,显示数据。在另一个 (parent) UI 中,我想多次嵌入第一个 UI (child),具体取决于 parent 中加载的一些数据。所以现在我有两个问题:
- 我可以使用弹簧
@Autowired
注释将我的 child UI 的多个实例注入 parent 吗?如果是,我该怎么做?
- 如何将参数传递给
@Autowired
child class 的构造函数?
我已经发现,我必须用 @Autowired
.
注释 child class 的构造函数
我的 child UI class with constructor (annotated with @Autowired
)
public class ChildUI {
private String arg1;
private String arg2;
@Autowired
public ChildUI(String arg1, String arg2){
this.arg1 = arg1;
this.arg2 = arg2;
}
}
在我的 parent class 中,我想做这样的事情(personList 从数据库加载):
public class ParentUI {
...
for(Person p : personList){
//inject instance of ChildUI here and pass p.getLastName() to arg1 and p.getFirstName() to arg2
}
...
}
我用谷歌搜索了一段时间,但没有真正找到我要找的东西。也许我只是不知道要搜索什么关键字。有人可以解释一下该怎么做吗?
只需像往常一样创建 ChildUI
for(Person p : personList){
ChildUI someChild=nChildUI(p.getLastName(),m.getFirstName());
}
...
并用 someChild
做点什么
或者如果 ChildUI
注入了一些其他依赖项 - 首先使其成为原型范围,然后
@Autowire
private ApplicationContext ctx;
....
for(Person p : personList){
ChildUI someChild=ctx.getBean(ChildUI.class,p.getLastName(),m.getFirstName());
}
我不确定我是否完全理解你的问题,所以如果这不是你的意思,请告诉我。
创建您的 childUI 的多个实例:这很简单,在您的配置中创建多个 bean class:
@Configuration
public class ApplicationConfiguration {
@Bean
public ChildUI firstBean(){
return new ChildUI(arg1,arg2);
}
@Bean
public ChildUI secondBean(){
return new ChildUI(otherArg1,otherArg2);
}
@Bean
public ChildUI thirdBean(){
return new ChildUI(arg1,arg2);
}
}
注入其他 bean 的多个实例:如果您自动装配一个 bean 类型的集合(或列表),它的所有实例都将注入它:
public class ParentUI {
private final Set<ChildUI> children;
@Autowired
public ParentUI(Set<ChildUI> children) {
this.childern = children;//this will contain all three beans
}
}
我有一个带有 2 个参数的构造函数的 vaadin UI class。它用一些字段构建一条简单的线,显示数据。在另一个 (parent) UI 中,我想多次嵌入第一个 UI (child),具体取决于 parent 中加载的一些数据。所以现在我有两个问题:
- 我可以使用弹簧
@Autowired
注释将我的 child UI 的多个实例注入 parent 吗?如果是,我该怎么做? - 如何将参数传递给
@Autowired
child class 的构造函数?
我已经发现,我必须用 @Autowired
.
我的 child UI class with constructor (annotated with @Autowired
)
public class ChildUI {
private String arg1;
private String arg2;
@Autowired
public ChildUI(String arg1, String arg2){
this.arg1 = arg1;
this.arg2 = arg2;
}
}
在我的 parent class 中,我想做这样的事情(personList 从数据库加载):
public class ParentUI {
...
for(Person p : personList){
//inject instance of ChildUI here and pass p.getLastName() to arg1 and p.getFirstName() to arg2
}
...
}
我用谷歌搜索了一段时间,但没有真正找到我要找的东西。也许我只是不知道要搜索什么关键字。有人可以解释一下该怎么做吗?
只需像往常一样创建 ChildUI
for(Person p : personList){
ChildUI someChild=nChildUI(p.getLastName(),m.getFirstName());
}
...
并用 someChild
或者如果 ChildUI
注入了一些其他依赖项 - 首先使其成为原型范围,然后
@Autowire
private ApplicationContext ctx;
....
for(Person p : personList){
ChildUI someChild=ctx.getBean(ChildUI.class,p.getLastName(),m.getFirstName());
}
我不确定我是否完全理解你的问题,所以如果这不是你的意思,请告诉我。
创建您的 childUI 的多个实例:这很简单,在您的配置中创建多个 bean class:
@Configuration
public class ApplicationConfiguration {
@Bean
public ChildUI firstBean(){
return new ChildUI(arg1,arg2);
}
@Bean
public ChildUI secondBean(){
return new ChildUI(otherArg1,otherArg2);
}
@Bean
public ChildUI thirdBean(){
return new ChildUI(arg1,arg2);
}
}
注入其他 bean 的多个实例:如果您自动装配一个 bean 类型的集合(或列表),它的所有实例都将注入它:
public class ParentUI {
private final Set<ChildUI> children;
@Autowired
public ParentUI(Set<ChildUI> children) {
this.childern = children;//this will contain all three beans
}
}