Spring 系列教程


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

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

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

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

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

我们有下面几个类:

Database.java


package com.qikegu.demo; import org.springframework.stereotype.Component; @Component
public class Database implements Service { @Override
public String name() {
return "数据库名称:MySQL";
} @Override
public void run() {
System.out.println("数据库正在运行");
} @Override
public void stop() {
System.out.println("数据库已经停止");
}
}

Logger.java

package com.qikegu.demo;

import org.springframework.stereotype.Component;

@Component
public class Logger implements Service {
@Override
public String name() {
return "Logger X";
} @Override
public void run() {
System.out.println("Loggery已经准备好");
} @Override
public void stop() {
System.out.println("Logger已经停止");
}
}

Mail.java

package com.qikegu.demo;

import org.springframework.stereotype.Component;

@Component
public class Mail implements Service {
@Override
public String name() {
return "邮件收发";
} @Override
public void run() {
System.out.println("邮件收发正在运行");
} @Override
public void stop() {
System.out.println("邮件收发已经停止");
}
}

1. 构造方法注入

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

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; @Component
public class App { private Service mainService;
private Service[] services; public App(){
} /*
// 构造方法注入
@Autowired
public App(@Qualifier("logger") Service main){
this.setMainService(main);
}
*/ // 构造方法注入
@Autowired
public App(Service[] services){
this.setServices(services);
} public Service getMainService() {
return mainService;
} public void setMainService(Service mainService) {
this.mainService = mainService;
} public Service[] getServices() {
return services;
} public void setServices(Service[] services) {
this.services = services;
}
}

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

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

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

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

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

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

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

2. Setter方法注入

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

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; @Component
public class App { private Service mainService;
private Service[] services; public App(){
} public Service getMainService() {
return mainService;
} // Setter方法注入
@Autowired
@Qualifier("logger")
public void setMainService(Service mainService) {
this.mainService = mainService;
} public Service[] getServices() {
return services;
} @Autowired
public void setServices(Service[] services) {
this.services = services;
}
}

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

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

3. 字段注入

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

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; @Component
public class App { // 字段注入
@Autowired
@Qualifier("logger")
private Service mainService; // 字段注入
@Autowired
private Service[] services; public App(){
} public Service getMainService() {
return mainService;
} public Service[] getServices() {
return services;
}
}
  • 问题:前面提到这几种依赖注入类型,哪种比较好?

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

通过注解注入值

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

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component
public class App { // 使用@Value注解注入值
@Value("1024")
private int id; public App(){
} // 使用@Value注解注入值
public App(@Value("1024") int id){
this.id = id;
} public int getId() {
return id;
} // 使用@Value注解注入值
@Value("1024")
public void setId(int id) {
this.id = id;
}
}

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. HTML<video></video>视频无法自动播放

    1.video 标签属性 src: 设置显示视频路径 controls: 显示控制栏 loop: 控制视频循环播放 autoplay: 自动播放 muted:设置静音播放 2.解决视频或音频标签自动播 ...

  2. shell脚本中执行sql脚本(mysql为例)

    1.sql脚本(t.sql) insert into test.t value ("LH",88); 2.shell脚本(a.sh     为方便说明,a.sh与t.sql在同一目 ...

  3. 2_04_MSSQL课程_查询_类型转换、表联合、日期函数、字符串函数

    类型转换 Convert(目标类型,转换的表达式,格式规范) Cast(表达式 as 类型) select Convert(nvarchar(32)),CustomerId))+Title from ...

  4. 关于2017届学长制作分享软件share(失物招领)的使用体验和需改进的内容

    使用体验 1.注册界面 注册界面提示明显,提示用户输入什么类型的密码,而且输入什么样的用户名不限,注册界面色调比较单一,注册内容比较少,而且比较简单,体验感比较好,但注册界面色调和设计全无,使用感一般 ...

  5. Day1-E-BZOJ1293

    Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...

  6. nosql概叙

    关系型数据库管理系统:按照预先设置的组织架构,将数据存储在物理介质上 数据之间可以做关联操作

  7. LoadRunner监控Linux系统

    需要下载3个包:  地址链接:链接:https://pan.baidu.com/s/1lltAa6JnjJ7Mr88duixUSQ 密码:5yiw(1)rsh-0.17-14.i386.rpm (2) ...

  8. Django(十七):静态文件、中间件

    一.静态文件 参考:https://www.cnblogs.com/jiajiaba/p/10584329.html 参考:https://docs.djangoproject.com/zh-hans ...

  9. 题解 nflsoj550 【六校联合训练 省选 #9】序列

    题目链接 以下把值域(题面里的\(lim\))记做\(m\). 考虑求\(k\)的答案.考虑每个位置对答案的贡献,枚举位置\(i\),再枚举\(a[i]\)的值\(x\).设: \[ F(k)=\su ...

  10. 蓝桥杯 能量项链 (区间dp)

    问题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...