在Spring从自动装配中排除Bean
时间:2020-01-09 10:44:28 来源:igfitidea点击:
如果我们想在每个豆的基础上排除在Spring中自动装配bean,那么以Spring的XML格式,可以通过将<bean />元素的autowire-candidate属性设置为false来完成。 Spring容器使该特定的bean定义不可用于自动装配(这也适用于注释样式配置,例如@Autowired)。
自动装配中不包括Bean –自动接线候选示例
在该示例中,有一个用于下订单的类称为OrderService,可以从商店进行购买。在OrderService类中,必须自动关联商店的依赖关系。
有两种类型为IStore的类,我们想从自动装配中排除其中一个bean,以便不引发NoUniqueBeanDefinitionException。
public interface OrderService { public void buyItems(); }
import org.springframework.beans.factory.annotation.Autowired; public class OrderServiceImpl implements OrderService { private IStore store; @Autowired public OrderServiceImpl(IStore store){ this.store = store; } public void buyItems() { store.doPurchase(); } }
如我们所见,OrderServiceImpl类具有类型为Istore的依赖项,该依赖项会自动构造为构造函数参数。
public interface IStore { public void doPurchase(); }
public class RetailStore implements IStore { public void doPurchase() { System.out.println("Doing purchase from Retail Store"); } }
public class OnlineStore implements IStore { public void doPurchase() { System.out.println("Doing purchase from Online Store"); } }
XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <!-- Store bean --> <bean id="retailStore" class="com.theitroad.springproject.service.RetailStore" /> <!-- Store bean --> <bean id="onlineStore" class="com.theitroad.springproject.service.OnlineStore" autowire-candidate="false" /> <!-- OrderServiceImpl bean with store bean dependency --> <bean id="orderBean" class="com.theitroad.springproject.service.OrderServiceImpl" /> </beans>
在onlineStore的bean定义中,将autowire-candidate属性设置为false,以便将该bean排除在自动装配之外。
通过排除其中一个bean,可以避免NoUniqueBeanDefinitionException,如果有多个相同类型的bean,则抛出该异常。我们可以通过从onlineStore bean的定义中删除autowire-candidate =" false"进行检查。
Error creating bean with name 'orderBean' defined in class path resource [appcontext.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.theitroad.springproject.service.IStore' available: expected single matching bean but found 2: retailStore,onlineStore
自动布线时还有其他解决冲突的方法,请检查使用@Autowired注释的Spring自动布线以了解如何使用@Primary和@Qualifier注释进行操作。