如何优先使用相同id的spring bean?
How to give priority to spring bean with same id?
在我们的项目中,我们使用 spring 和 Junit
进行 Junit 测试。我们使用 @ContextConfiguration
注释来加载多个文件。我们有两个 类 AbstractContextJUnitTest
和 ContextJUnitTest
和 ContextJUnitTest
extends AbstractContextJUnitTest
.
在代码流中,我注意到在具有不同 bean 类型的多个文件中存在相同的 bean Id。当我测试这些 Junits 并收到以下错误时。
错误:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean
named 'voterId' is expected to be of type [com.spring.test2.Student]
but was actually of type [com.spring.test2.Parent]
我的要求是 Student bean 应该加载 VoterId 而不是 Parent Bean。
下面是 java 文件和 spring bean xml 文件:
test.xml:
<beans>
<context:annotation-config/>
<bean id="voterId" class="com.spring.test2.Parent">
<property name="Name" value="hai"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="system" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
test1.xml
<beans>
<context:annotation-config/>
<bean id="voterId" class="com.spring.test2.Student">
<property name="name" value="hello"/>
<property name="number" value="2080"/>
</bean>
</beans>
AbstractContextJUnitTest.java
@ContextConfiguration(locations="classpath:/com/spring/test2/test1.xml")
public class AbstractContextJUnitTest extends AbstractTransactionalJUnit4SpringContextTests{
}
ContextJUnitTest.java
@ContextConfiguration(locations={"classpath:/com/spring/test2/test.xml"})
public class ContextJUnitTest extends AbstractContextJUnitTest{
@Test
public void testStudent(){
Student stud=applicationContext.getBean("voterId",Student.class);
assertEquals(stud.getNumber(), 2080);
}
}
这可能是因为您按顺序扩展了 classes..而您的 test.xml 没有任何 Student 的 bean。所以它只是继承并找到父级。
下面几行让它首先在 test.xml 中查找 bean voterid,并在那里找到了它。
ContextConfiguration(位置={"classpath:/com/spring/test2/test.xml"}) public class ContextJUnitTest
你试过了吗@Primary?
<bean id="voterId" class="com.spring.test2.Student" primary="true">
<property name="name" value="hello"/>
<property name="number" value="2080"/>
</bean>
你必须在任何需要的地方使用 @Qualifier 作为 com.spring.test2.Parent
。
或者您可以获得类型为的 bean:
applicationContext.getBeansOfType(Student.class).get("voterId")
在我们的项目中,我们使用 spring 和 Junit
进行 Junit 测试。我们使用 @ContextConfiguration
注释来加载多个文件。我们有两个 类 AbstractContextJUnitTest
和 ContextJUnitTest
和 ContextJUnitTest
extends AbstractContextJUnitTest
.
在代码流中,我注意到在具有不同 bean 类型的多个文件中存在相同的 bean Id。当我测试这些 Junits 并收到以下错误时。
错误:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'voterId' is expected to be of type [com.spring.test2.Student] but was actually of type [com.spring.test2.Parent]
我的要求是 Student bean 应该加载 VoterId 而不是 Parent Bean。
下面是 java 文件和 spring bean xml 文件:
test.xml:
<beans>
<context:annotation-config/>
<bean id="voterId" class="com.spring.test2.Parent">
<property name="Name" value="hai"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="system" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
test1.xml
<beans>
<context:annotation-config/>
<bean id="voterId" class="com.spring.test2.Student">
<property name="name" value="hello"/>
<property name="number" value="2080"/>
</bean>
</beans>
AbstractContextJUnitTest.java
@ContextConfiguration(locations="classpath:/com/spring/test2/test1.xml")
public class AbstractContextJUnitTest extends AbstractTransactionalJUnit4SpringContextTests{
}
ContextJUnitTest.java
@ContextConfiguration(locations={"classpath:/com/spring/test2/test.xml"})
public class ContextJUnitTest extends AbstractContextJUnitTest{
@Test
public void testStudent(){
Student stud=applicationContext.getBean("voterId",Student.class);
assertEquals(stud.getNumber(), 2080);
}
}
这可能是因为您按顺序扩展了 classes..而您的 test.xml 没有任何 Student 的 bean。所以它只是继承并找到父级。 下面几行让它首先在 test.xml 中查找 bean voterid,并在那里找到了它。 ContextConfiguration(位置={"classpath:/com/spring/test2/test.xml"}) public class ContextJUnitTest
你试过了吗@Primary?
<bean id="voterId" class="com.spring.test2.Student" primary="true">
<property name="name" value="hello"/>
<property name="number" value="2080"/>
</bean>
你必须在任何需要的地方使用 @Qualifier 作为 com.spring.test2.Parent
。
或者您可以获得类型为的 bean:
applicationContext.getBeansOfType(Student.class).get("voterId")