Bean 注解(Annotation)配置(3)- 依赖注入配置
Spring 系列教程
- Spring 框架介绍
- Spring 框架模块
- Spring开发环境搭建(Eclipse)
- 创建一个简单的Spring应用
- Spring 控制反转容器(Inversion of Control – IOC)
- 理解依赖注入(DI – Dependency Injection)
- Bean XML 配置(1)- 通过XML配置加载Bean
- Bean XML 配置(2)- Bean作用域与生命周期回调方法配置
- Bean XML 配置(3)- 依赖注入配置
- Bean XML 配置(4)- 自动装配
- Bean 注解(Annotation)配置(1)- 通过注解加载Bean
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
- Bean 注解(Annotation)配置(3)- 依赖注入配置
- Bean Java配置
- Spring 面向切面编程(AOP)
- Spring 事件(1)- 内置事件
- Spring 事件(2)- 自定义事件
注解方式配置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)- 依赖注入配置的更多相关文章
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Bean 注解(Annotation)配置(1)- 通过注解加载Bean
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Bean XML 配置(3)- 依赖注入配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Spring系列.依赖注入配置
依赖注入的配置 Spring的依赖注入分为基于构造函数的依赖注入和基于setter方法的依赖注入. 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bea ...
- Spring4笔记5--基于注解的DI(依赖注入)
基于注解的DI(依赖注入): 对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例.只需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解. < ...
- 【学习笔记】 使用XML配置和注解实现Spring的依赖注入DI (2-3-2)
Spring的四个核心组件 1.beans Bean是包装应用程序自定义对象Object的 Object中保存数据 2.core 3.context 一个Bean的关系集合 4.expression ...
- Spring ——依赖注入配置一些知识点
依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...
- SSH-运行main函数,一直报空指针,调依赖注入配置的dao
解决this.getHibernateTemplate()==null的问题 刚刚在整合SSH时碰到了这样一个问题: 当我用junit测试时不会报任何异常,数据也都能得到 但当我运行man函数,直接n ...
- spring注解(Component、依赖注入、生命周期、作用域)
1.注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2.@Component 取代<bean class="">,@Component 取代 ...
随机推荐
- Vue - 引入本地图片的两种方式
第一种,只引入单个图片,这种引入方法在异步中引入则会报错. 比如需要遍历出很多图片展示时 <image :src = require('图片的路径') /> 第二种,可引入多个图片,也可引 ...
- 「SDOI2015」寻宝游戏
传送门 Luogu 解题思路 发现一个性质: 对于所有的宝藏点 \({a_1,a_2...a_k}\) ,按照dfs序递增排列,答案就是: \(dis(a_1, a_2) + dis(a_2, a_3 ...
- 想要转战CSDN了!!
CSDN博客地址: https://blog.csdn.net/weixin_41559364
- LINQ---查询语法和方法语法
namespace ConsoleApplication45 { class Program { static void Main(string[] args) { , , , , , , }; va ...
- Java的SpringMVC执行流程
SpringMVC找Controller流程 1.扫描整个项目(Spring已经做了)定义一个Map集合. 2.拿到所有加了@Controller注解的类. 3.遍历类里面的所有方法对象. 4.判断方 ...
- L2-012. 关于堆的判断(最小堆)
将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y are siblings”:x和y ...
- dubbo 相关面试题 有用(转)
调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...
- package报错
java类的第一行package 包路径 package报错 jdk版本不一致 或者jar包冲突
- windows清理命令
总是有一些设备需要清理,第三方的软件有不可以安装,那么,就需要这两条命令来做: cleanmgr /sageset:99 #设置要被清理的东西 cleanmgr /sagerun:99 #执行清理操作 ...
- 剑指offer 按之字型顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 使用两个栈进行存储,我们在打印某一行节点 ...