默认根据类型,匹配不到则根据bean名字

1.声明一个service接口

public interface HelloService {
void sayHello();
}

2.service接口的实现类,此时bean名字是 helloServiceImpl

@Service
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("say hello impl");
}
}

3.增加一个Controller,注入service

// 生成一个bean,名字为 helloController
@Controller
public class HelloController {
@Autowired
private HelloService helloService; public void hello() {
helloService.sayHello();
}
}

4.测试①:

public class AppTest {

    public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloController controller = (HelloController) context.getBean("helloController");
controller.hello();
}
}

结果如下

成功将Service层的实现类注入到Controller层中,可以把步骤3 代码修改一下

// 生成一个bean,名字为 helloController
@Controller
public class HelloController {
@Autowired
private HelloService abc; public void hello() {
abc.sayHello();
}
}

结果也是可以的,因为@Autowired 第一是按照类型去匹配的,此时IoC容器中HelloService 接口只有一个实现类,所以属性名字怎么写都没关系,都可以注入进去

测试②:增加一个实现类,此时bean名字是 newServiceImpl

@Service
public class NewHelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("new say hello impl");
}
}

现在IoC容器中有两个 HelloService接口的实现类,继续运行测试方法,结果为

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'helloController':
Unsatisfied dependency expressed through field 'abc';
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'com.convict.service.HelloService' available:
expected single matching bean but found 2: helloServiceImpl,newHelloServiceImpl

因为一个接口有多个实现,所以@Autowired 就按照属性名字去找,即找一个名字为 abc的bean注入,然而IoC容器不存在一个名字叫abc的 bean,因此报错,把属性名改为下面任意一种就可以匹配到了

// 生成一个bean,名字为 helloController
@Controller
public class HelloController {
@Autowired
private HelloService helloServiceImpl; @Autowired
private HelloService newHelloServiceImpl; public void hello() {
helloServiceImpl.sayHello();
newHelloServiceImpl.sayHello();
}
}

测试③:

那我就要把属性名叫 abc,同时有多个实现,而且还能注入,那么在声明组件的时候取个名字就好了,比如

@Service("abc")
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("say hello impl");
}
}

然后Controller 注入的还是abc,结果注入成功

// 生成一个bean,名字为 helloController
@Controller
public class HelloController {
@Autowired
private HelloService abc; public void hello() {
abc.sayHello();
}
}

测试④:

属性名叫 abc,同时有多个实现,同时可以注入,且不在注解处声明bean 的名字,那么这时候使用新的注解@Qualifier 配合@Autowired 一起使用

// 生成一个bean,名字为 helloController
@Controller
public class HelloController {
@Autowired
@Qualifier("helloServiceImpl")
private HelloService abc; public void hello() {
abc.sayHello();
}
}

@Qualifier是指定 一个bean的名字

总结:

1.一个接口只有一个实现的情况下,属性名字怎么写都无所谓,因为按照类型匹配就只有一个bean

2.一个接口多个实现的情况下:

  ① 属性名字跟组件名字一致,组件名字可以在声明的时候指定,比如 @Service("abc")

  ② 属性名字跟组件名字不一致,配合@Qualifier 注解指定组件名字

Spring中@Autowired 注解的注入规则的更多相关文章

  1. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...

  2. Spring中@Autowired注解与自动装配

    1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ...

  3. Spring中Autowired注解,Resource注解和xml default-autowire工作方式异同

    前面说到了关于在xml中有提供default-autowire的配置信息,从spring 2.5开始,spring又提供了一个Autowired以及javaEE中标准的Resource注释,都好像可以 ...

  4. Spring中 @Autowired注解与J2EE@Resource注解的区别

    在开发中经常使用到@Autowired和@Resource进行装配. 不禁好奇这两个注解的差异在何处??? 相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的sett ...

  5. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  6. 转:Spring中@Autowired注解、@Resource注解的区别

    Pay attention: When using these annotations, the object itself has to be created by Spring context. ...

  7. Spring中的注解配置-注入bean

    在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...

  8. @Resource或者@Autowired作用/Spring中@Autowired注解、@Resource注解的区别

    @Resource或者@Autowired作用不用写set get就能注入,当然,前提是你已经开启了注解功能. spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定 ...

  9. Spring中 @Autowired注解与@Resource注解的区别

    Spring中 @Autowired注解与@Resource注解的区别在Spring 3.X中经常使用到@Autowired和@Resource进行装配.这两个注解的差异在何处???相同点:@Reso ...

随机推荐

  1. 初识python:tkinter 实现 弹球小游戏(非面相对象)

    通过 tkinter 采用非面相对象式实现弹球小游戏(使用蹩脚式面相对象实现). #!/user/bin env python # author:Simple-Sir # time:2020/8/3 ...

  2. Flask_响应(四)

    响应即视图函数的返回值,前面的例子的返回值都很简单,直接返回值.但是Flask Http协议的返回值中通常还会有以下几种不同的方式. 一.return元组 通过return一个元组构造响应信息. 语法 ...

  3. Go语言系列之标准库os

    os包提供了操作系统的系列函数,这些接口不依赖平台.设计为Unix风格的,错误处理是go风格的:调用失败会返回错误值而非错误码.通常错误值里包含更多信息. os包的接口在所有操作系统中都是一致的.非公 ...

  4. 动静分离、Rewirte、HTTPS

    目录 Nginx动静分离技术 示例搭建步骤 部署NFS 静态资源共享 部署代理服务器 Rewrite(重点) Rewrite基本概述 rewrite语法 rewrite标记Flag last和brea ...

  5. python+selenium 定位元素的主要方法

    selenium对web各元素的操作首先就要先定位元素,定位元素的方法主要有以下几种: 通过id定位元素:find_element_by_id("id_vaule") 通过name ...

  6. MCU软件最佳实践——独立按键

    1. 引子 在进行mcu驱动和应用开发时,经常会遇到独立按键驱动的开发,独立按键似乎是每一个嵌入式工程师的入门必修课.笔者翻阅了许多书籍(包括上大学时候用的书籍)同时查阅了网上许多网友的博客,无一例外 ...

  7. RHCSA 第一天

    1.修改主机名: 查看主机名 2.查看日期 使用指定格式输出日期 YY-mm-DD HH:MM:SS 3.将"We are learning RHCSA"输出在屏幕上 4.使用ti ...

  8. html,js 获取父窗口元素

    $("#父窗口元素ID",window.parent.document) window.parent.document.getElementById("父窗口元素ID&q ...

  9. 【计算机理论】CSAPP ch2

    信息存储 十六进制表示法 (略) 字数据大小 大多数计算机使用8bit的块(字节)作为最小的可寻址的内存单元 字长指明了指针数据的标称大小(?) 64位系统和32位系统向后兼容 C语言中有些数据类型的 ...

  10. Go 结构体方法

    #### Go 结构体方法本来今天有些事情忙的不准备更新内容了,后来提前完成了, 所以还是要更新了; 毕竟坚持本就是一件不容易的事情!加油,相信不管是大家还是我,都有一些事情想要做,那就坚持吧,剩下的 ...