Java 使用混合配置的Spring依赖项注入时创建多个对象
我似乎遇到了这个问题,即当我使用注释为某些类配置依赖注入时,以及通过xml文件中的配置为其他类配置依赖注入时 我有一个构造函数注入,我需要将Java 使用混合配置的Spring依赖项注入时创建多个对象,java,spring,dependency-injection,Java,Spring,Dependency Injection,我似乎遇到了这个问题,即当我使用注释为某些类配置依赖注入时,以及通过xml文件中的配置为其他类配置依赖注入时 我有一个构造函数注入,我需要将SuperBean对象注入到两个类的构造函数中,它们得到SuperBean的不同实例,因为一个配置了注释,另一个配置在xml文件中,所以SuperBean定义如下: @Component("SuperBean") public class SuperBean extends InjectableBean { 已配置注释构造函数的类的构造函数: @Autow
SuperBean
对象注入到两个类的构造函数中,它们得到SuperBean
的不同实例,因为一个配置了注释,另一个配置在xml文件中,所以SuperBean
定义如下:
@Component("SuperBean")
public class SuperBean extends InjectableBean {
已配置注释构造函数的类的构造函数:
@Autowired
public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
super();
this.superBean = superBean;
this.name = name;
}
public CustomXmlBean(String name, SuperBean superBean) {
super(name, superBean);
}
和另一类的构造函数:
@Autowired
public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
super();
this.superBean = superBean;
this.name = name;
}
public CustomXmlBean(String name, SuperBean superBean) {
super(name, superBean);
}
它的配置在xml文件中:
<bean id="CustomXmlBean" class="org.arturas.summerfav.beans.CustomXmlBean">
<constructor-arg name="name" type="String" value="The Big Custom XML Bean" />
<constructor-arg>
<bean name="SuperBean" class="org.arturas.summerfav.beans.SuperBean" />
</constructor-arg>
</bean>
CustomXmlBean
类:
@Component("CustomBean")
public class CustomBean extends InjectableBean {
private String name;
private SuperBean superBean;
/**
* @param name - Bean name
*/
@Autowired
public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
super();
this.superBean = superBean;
this.name = name;
}
public class CustomXmlBean extends CustomBean {
public CustomXmlBean(String name, SuperBean superBean) {
super(name, superBean);
}
为什么构造器返回一个不同的类CustomBean?你能发布整个源代码吗 编辑:将评论中的答案添加到主答案中
对不起,我被最初的帖子误导了。试试这个
<constructor-arg index="1" ref="SuperBean"/>
您试过给他们取相同的名字吗?我以前从未用Spring尝试过,但它可能会起作用(或者创建2个,只保留1个)。@DanielWilliams但在这些代码示例中,我相信名称已经相同了?我尝试在xml文件中使用id而不是名称,但结果是我误读了发生的事情。您可以在XML中尝试这样做吗?这更像是一个注释而不是一个答案。这是两个不同(但非常相似)的类,这就是为什么它们都有自己的构造函数,一个有CustomBean,另一个有CustomXMLBean,但它们采用相同的构造函数参数,并且应该加载相同的SuperBean。抱歉,我被最初的帖子误导了。试试这个谢谢,这个很好用。但是你能解释一下这里有什么吗?index=“1”表示我们在引用构造函数中的第二个参数,对吗?所以,如果它是index=“1”,那么它将是index=“0”?ref=“SuperBean”意味着它引用文件中某处定义的bean,或者使用注释作为“SuperBean”?是名称还是id?是的,您是对的,您可以使用名称/位置索引连接依赖项。您在构造函数中提供了一个新的SuperBean实例。如果ID相同,Spring将“覆盖”bean定义——它们将按照容器遇到的顺序被覆盖。假设在同一个/other xml/任何其他配置机制中有两个bean定义,第二个将覆盖第一个bean定义。