Spring 系列教程


注解方式配置Bean之间的依赖关系,可通过注解:@Autowired

Spring扫描所有带有@Component注解的类,将其注册为bean,然后Spring找到带有@Autowired注解的变量,把所依赖的Bean注入。

使用@Autowired注解注入依赖项有3种方法:

  • 构造函数注入
  • Setter注入
  • 字段注入

确保所依赖的类已经配置成Bean,否则不能注入。

我们有下面几个类:

Database.java


  1. package com.qikegu.demo;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Database implements Service {
  5. @Override
  6. public String name() {
  7. return "数据库名称:MySQL";
  8. }
  9. @Override
  10. public void run() {
  11. System.out.println("数据库正在运行");
  12. }
  13. @Override
  14. public void stop() {
  15. System.out.println("数据库已经停止");
  16. }
  17. }

Logger.java

  1. package com.qikegu.demo;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Logger implements Service {
  5. @Override
  6. public String name() {
  7. return "Logger X";
  8. }
  9. @Override
  10. public void run() {
  11. System.out.println("Loggery已经准备好");
  12. }
  13. @Override
  14. public void stop() {
  15. System.out.println("Logger已经停止");
  16. }
  17. }

Mail.java

  1. package com.qikegu.demo;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Mail implements Service {
  5. @Override
  6. public String name() {
  7. return "邮件收发";
  8. }
  9. @Override
  10. public void run() {
  11. System.out.println("邮件收发正在运行");
  12. }
  13. @Override
  14. public void stop() {
  15. System.out.println("邮件收发已经停止");
  16. }
  17. }

1. 构造方法注入

使用@Autowired注解将依赖项注入类的构造方法。

App.java

  1. package com.qikegu.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class App {
  7. private Service mainService;
  8. private Service[] services;
  9. public App(){
  10. }
  11. /*
  12. // 构造方法注入
  13. @Autowired
  14. public App(@Qualifier("logger") Service main){
  15. this.setMainService(main);
  16. }
  17. */
  18. // 构造方法注入
  19. @Autowired
  20. public App(Service[] services){
  21. this.setServices(services);
  22. }
  23. public Service getMainService() {
  24. return mainService;
  25. }
  26. public void setMainService(Service mainService) {
  27. this.mainService = mainService;
  28. }
  29. public Service[] getServices() {
  30. return services;
  31. }
  32. public void setServices(Service[] services) {
  33. this.services = services;
  34. }
  35. }

注意:只能有一个构造方法用于自动装配。

  • 问题1: 可以看到构造方法的参数类型Service是一个接口,它有几个实现类,那么这里将注入哪个实现类的实例呢?

如果只有一个实现类,默认情况下将注入这个类。

如果有多个实现类,需要使用@Qualifier("bean_id")注解显式指定。如果没有指定,Spring容器将根据变量名匹配一个实现类,如果找不到匹配,抛出异常。

对于public App(Service[] services) Service数组:Spring将注入所有实现类的实例。

  • 问题2: Spring容器以何种方式匹配Bean?

默认情况下是通过数据类型(byType),当使用@Qualifier注解时,是通过名称(byName)。

2. Setter方法注入

调用带有@Autowired注解的setter方法注入依赖项。

App.java

  1. package com.qikegu.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class App {
  7. private Service mainService;
  8. private Service[] services;
  9. public App(){
  10. }
  11. public Service getMainService() {
  12. return mainService;
  13. }
  14. // Setter方法注入
  15. @Autowired
  16. @Qualifier("logger")
  17. public void setMainService(Service mainService) {
  18. this.mainService = mainService;
  19. }
  20. public Service[] getServices() {
  21. return services;
  22. }
  23. @Autowired
  24. public void setServices(Service[] services) {
  25. this.services = services;
  26. }
  27. }

其实任何带有@Autowired注解的方法,都可以注入依赖项,而不仅限于Setter方法。

  1. // Setter方法注入
  2. @Autowired
  3. @Qualifier("logger")
  4. public void anyMethod(Service mainService) {
  5. this.mainService = mainService;
  6. }

3. 字段注入

通过在对象字段上使用@Autowired注解注入依赖项。

App.java

  1. package com.qikegu.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class App {
  7. // 字段注入
  8. @Autowired
  9. @Qualifier("logger")
  10. private Service mainService;
  11. // 字段注入
  12. @Autowired
  13. private Service[] services;
  14. public App(){
  15. }
  16. public Service getMainService() {
  17. return mainService;
  18. }
  19. public Service[] getServices() {
  20. return services;
  21. }
  22. }
  • 问题:前面提到这几种依赖注入类型,哪种比较好?

各有优点,看自己偏好,选择一个在整个项目中保持一致

通过注解注入值

使用构造方法、setter方法和字段除了可以注入依赖项,还可以注入值。

App.java

  1. package com.qikegu.demo;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class App {
  6. // 使用@Value注解注入值
  7. @Value("1024")
  8. private int id;
  9. public App(){
  10. }
  11. // 使用@Value注解注入值
  12. public App(@Value("1024") int id){
  13. this.id = id;
  14. }
  15. public int getId() {
  16. return id;
  17. }
  18. // 使用@Value注解注入值
  19. @Value("1024")
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23. }

Bean 注解(Annotation)配置(3)- 依赖注入配置的更多相关文章

  1. Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  2. Bean 注解(Annotation)配置(1)- 通过注解加载Bean

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  3. Bean XML 配置(3)- 依赖注入配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  4. Spring系列.依赖注入配置

    依赖注入的配置 Spring的依赖注入分为基于构造函数的依赖注入和基于setter方法的依赖注入. 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bea ...

  5. Spring4笔记5--基于注解的DI(依赖注入)

    基于注解的DI(依赖注入): 对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例.只需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解. < ...

  6. 【学习笔记】 使用XML配置和注解实现Spring的依赖注入DI (2-3-2)

    Spring的四个核心组件 1.beans Bean是包装应用程序自定义对象Object的 Object中保存数据 2.core  3.context 一个Bean的关系集合 4.expression ...

  7. Spring ——依赖注入配置一些知识点

    依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...

  8. SSH-运行main函数,一直报空指针,调依赖注入配置的dao

    解决this.getHibernateTemplate()==null的问题 刚刚在整合SSH时碰到了这样一个问题: 当我用junit测试时不会报任何异常,数据也都能得到 但当我运行man函数,直接n ...

  9. spring注解(Component、依赖注入、生命周期、作用域)

    1.注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2.@Component 取代<bean  class="">,@Component 取代 ...

随机推荐

  1. 第2节 storm实时看板案例:9、实时看板综合案例

    =================================== 10.实时看板案例 10.1 项目需求梳理 根据订单mq,快速计算双11当天的订单量.销售金额.

  2. Linux文件系统层次结构标准FHS

    文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了Linux操作系统中的主要目录及目录内容.FHS由Linux基金会维护. 当前版本为3.0版,于2 ...

  3. windows系统下 VUE cli手脚架环境安装

    1.安装 node.js环境  (cmd命令工具里输入 node -v 检测是否安装成功) 2.安装VUE 全局环境 npm install --global vue-cli (cmd命令工具里面安装 ...

  4. Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件

    一.管道符和作业控制 管道符|,用于将前一个指令的输出作为后一个指令的输入 #cat /etc/passwd|wc -l  作业控制:当运行程序时,可以使它暂停(Ctrl+Z组合键),然后使用fg(f ...

  5. lambda表达式和for_each,find_if

    1 lambda表达式可以允许我传递任意可调用对象,必须要有捕获列表和函数体,标准形式是[捕获列表] (参数列表)->return tpye{函数体} 谓词:一元谓词指的是只能接受一个传入参数, ...

  6. php 实现店铺装修6

    /** * @title 获取预览或发布的蜂店模板样式 * @param store_id 是 string 店铺id * @param type 是 int 装修模板的状态:1-预览蜂店装修模板样式 ...

  7. Eclipse 导入 Tomcat 源码

    我的环境:Win10,Eclipse 4.8.0 Photon,JDK 10.0.2   1.下载Tomcat源码 我下载的是:apache-tomcat-9.0.12-src.zip 下载地址:ht ...

  8. TeX 常用命令记录

    常用: $a_{i}^{2}$    a_{i}^{2} $\sqrt x$     $\sqrt[n] x$     \sqrt[n] x $\frac{1+2}{3+4}$ 重音符号: $\hat ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. poj 3617 Best Cow Line 贪心模拟

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42701   Accepted: 10911 D ...