Spring 自动装配的二义性

1.我们知道可以用Spring的自动装配(@Autowired)将Bean应用注入到构造参数和属性中,但是,注意了,仅有一个bean匹配需要的结果时,自动装配才可以生效。如果有多个bean匹配同一个结果,这种歧义性会阻碍Spring自动装配属性,构造参数或方法参数。

大白话说一下,就如我们有一个甜片接口(Dessert)里面有一个好吃的方法(good)当我们只有一个饼干实现这个接口时,Spring容器会选择饼干来装配,但是还有一个蛋糕实现接口时,这个时候Spring就不知道去选择哪个实现类来装配了。代码上!

(1)甜片的接口

package jinjin;
/**
 *
 * @author 雪飞oubai
 *    甜点接口
 */
public interface Dessert {
    public void good();
}

(2)有饼干实现这个接口

package jinjin;

import org.springframework.stereotype.Component;
/**
 * @author 雪飞oubai
 *    饼干类实现接口
 */
@Component
public class Cookies implements Dessert{

    @Override
    public void good() {
        System.out.println("饼干好吃!");
    }
}

(3)测试类,使用@Autowired来自动装配

package jinjin;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * @author 雪飞oubai
 *    测试一下
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ConfigTest.class)
public class CommTest {

    @Autowired
    private Dessert dessert;

    @Test
    public void test(){
        dessert.good();
    }

}

(4)java配置类

package jinjin;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * @author 雪飞oubai
 *    java配置类
 */
@Configuration
@ComponentScan
public class ConfigTest {

}

运行结果

(5)再加一个蛋糕类实现接口

package jinjin;

import org.springframework.stereotype.Component;
/**
 * @author 雪飞oubai
 *    蛋糕类实现甜片接口
 */
@Component
public class Cake implements Dessert {

    @Override
    public void good() {
        System.out.println("蛋糕好吃!");

    }
}

(6)继续运行看结果

报了NoUniqueBeanDefinitionException的异常。这就是自动装配的歧义性,具体解决方法,请看我下回解答!

原文地址:https://www.cnblogs.com/lililixuefei/p/11846164.html

时间: 2024-08-01 13:10:18

Spring 自动装配的二义性的相关文章

Java的注解机制——Spring自动装配的实现原理

使用注解主要是在需要使用Spring框架的时候,特别是使用SpringMVC.因为这时我们会发现它的强大之处:预处理. 注解实际上相当于一种标记,它允许你在运行时(源码.文档.类文件我们就不讨论了)动态地对拥有该标记的成员进行操作. 实现注解需要三个条件(我们讨论的是类似于Spring自动装配的高级应用):注解声明.使用注解的元素.操作使用注解元素的代码. 首先是注解声明,注解也是一种类型,我们要定义的话也需要编写代码,如下: 1 package annotation; 2 3 import j

Spring 自动装配 Bean

Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Beans——Spring自动装配Bean 所谓自动装配,就是将一个Bean注入到其他Bean的Prope

Spring基础系列8 -- Spring自动装配bean

Spring基础系列8 -- Spring自动装配bean 转载:http://www.cnblogs.com/leiOOlei/p/3548290.html 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Be

spring自动装配失败

用spring自动装配,如果把出错地方的@Autowired改为Autowired(required=false)不会出现错误.但是同时不会加载出错的类 如: @Autowired BaseDao dao:这错了 改为(找不到类时也报错) @Autowired(required=false) BaseDao dao:这就不报错了同时也不能注入BaseDao这个对象

Spring自动装配Bean详解

1.      Auto-Wiring 'no' 2.      Auto-Wiring 'byName' 3.      Auto-Wiring 'byType 4.      Auto-Wiring 'constructor' 5.      Auto-Wiring 'autodetect' Spring Auto-Wiring Beans--Spring自动装配Bean 所谓自动装配,就是将一个Bean注入到其他Bean的Property中,类似于以下: <bean id="cust

spring自动装配

spring提供了自动装配(autowiring)和自动检测(autodiscovery)用来减少XML的配置数量. 自动装配bean属性 byName——把与Bean的属性具有相同名字(或ID)的其他Bean自动装配到Bean的对应属性中. 示例: import com.springinaction.springdol.Instrumentalist; public class Instrumentalist{ private String song; private Object instr

Spring 自动装配

严格的说,实际分为自动检测和自动装配两方面. 先说自动检测,自动检测就是允许Spring自动检测与定义Bean.这就意味着,不使用<bean/>,你也能实现Spring中大多数的Bean的定义和装配. 为启用这一功能,你得引入context命名空间. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem

Spring自动装配与扫描注解

1 javabean的自动装配 自动注入,减少xml文件的配置信息. 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 到入xml文件的约束 --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:p="http://www.springframework.org/sche

spring自动装配Bean属性

spring提供了3种类型的自动装配 byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType:把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中. constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中. byName自动装配 <bean id="roles" class="cn.com.ztz.spring.model.Roles&q