Spring第九篇:primary指定bean为首选对象

  创建class文件

public class NoUniqueBean {
    public interface IService{}
    public static class ServiceA implements IService{}
    public static class ServiceB implements IService{}

    private IService service;

    public void setService(IService service) {
        this.service = service;
    }

    @Override
    public String toString() {
        return "NoUniqueBean{" +
                "service=" + service +
                '}';
    }
}

  配置bean.xml文件信息,注意noUniqueBean的自动注入类型是byType。

<bean id = "serviceB" class="com.java.spring01.demo6.NoUniqueBean.ServiceB" >
    </bean>
    <bean id = "serviceA" class="com.java.spring01.demo6.NoUniqueBean.ServiceA" >
    </bean>
    <bean id = "noUniqueBean" class="com.java.spring01.demo6.NoUniqueBean" autowire="byType"/>

  运行test方法,发现Spring容器在创建bean对象的时候会发现noUniqueBean的IService拥有两个实现类,会抛出异常。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.java.spring01.demo6.NoUniqueBean$IService' available: expected single matching bean but found 2: serviceB,serviceA

  当Spring容器中创建bean对象时,对他注入依赖的属性,发现有多个满足条件的依赖时,会报错。这时可以使用primary指定以哪个依赖为主。就不会出现报错。修改beam.xml文件指定主要的依赖bean对象。

<bean id = "serviceB" class="com.java.spring01.demo6.NoUniqueBean.ServiceB" primary="true">
    </bean>
    <bean id = "serviceA" class="com.java.spring01.demo6.NoUniqueBean.ServiceA" >
    </bean>
    <bean id = "noUniqueBean" class="com.java.spring01.demo6.NoUniqueBean" autowire="byType"/>

  test方法运行结果

NoUniqueBean{service=com.java.spring01.demo6.NoUniqueBean$ServiceB@2f0a87b3}

  

  当从容器中查找一个bean的时候,如果容器中出现多个Bean候选者时,可以通过primary="true"将当前bean置为首选者,那么查找的时候就会返回主要的候选者,否则将抛出异常。

  后记:

  在bean标签中加上 autowire-candidate="false",也可以实现,primary的效果,不过autowire-candidate="false"的意思是不做依赖注入的bean实例。
posted @ 2020-05-22 00:28  风缱云流  阅读(580)  评论(0编辑  收藏  举报