Spring IoC & DI (下)

目录

1.DI是什么

2.依赖注入的三种方式

1.属性注入 (Field Injection)

2.构造方法注入 (Constructor Injection)

[3.Setter 注入 (Setter Injection)](#3.Setter 注入 (Setter Injection))

3.依赖注入使用的注解

1)@Primary

2)@Qualifier

3)@Resource

4.Autowired装配顺序

5.三种注入的优缺点

1)属性注入

2)构造函数注入

3)setting注入

[6.常⻅注解有哪些? 分别是什么作⽤?](#6.常⻅注解有哪些? 分别是什么作⽤?)

[7.@Autowired 和 @Resource 区别](#7.@Autowired 和 @Resource 区别)


1.DI是什么

DI是依赖注入。依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象关于依赖注入。

2.依赖注入的三种方式

Spring也给我们提供了三种方式:

1.属性注入 (Field Injection)

java 复制代码
@Controller
public class UserController {
    
    // 前提:把UserService类交给spring管理了
    // 注入方法1: 属性注入
    @Autowired
    private UserService userService;

    public void sayHi() {
        System.out.println("hi, UserController...");
        userService.sayHi();
    }
}

2.构造方法注入 (Constructor Injection)

java 复制代码
@Controller
public class UserController {
    
    // 注入方法2:构造方法注入
    private UserService userService;

    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }

    public void sayHi() {
        System.out.println("hi, UserController...");
        userService.sayHi();
    }
}

3.Setter 注入 (Setter Injection)

java 复制代码
@Controller
public class UserController {
    
    // 注入方法3: Setter方法注入
    private UserService userService;
    
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    public void sayHi() {
        System.out.println("hi, UserController...");
        userService.sayHi();
    }
}

3.依赖注入使用的注解

依赖注入主要使用的注解是 @Autowired。但当同⼀类型存在多个bean,使⽤@Autowired会存在问题。

其他解决(非唯一的 Bean对象)的注解包括:

1)@Primary

(当存在多个同类型Bean时,设置默认注入的Bean)

java 复制代码
@Primary //指定该bean为默认bean的实现
@Bean("u1")
public User user1(){
    User user = new User();
    user.setName("zhangsan");
    return user;
}

2)@Qualifier

(指定Bean名称,需与@Autowired配合使用)

用法:@Qualifier("user2") // 指定bean名称

java 复制代码
@Qualifier("user2") //指定bean名称
 @Autowired
 private User user;

3)@Resource

(按照bean的名称进行注入)

通过name属性指定要注入的bean的名称。

java 复制代码
@Resource(name = "user2")
private User user;

4.Autowired装配顺序

5.三种注入的优缺点

1)属性注入

优点:简单,方便

缺点:只用于IoC容器;不能注入一个final修饰的属性

2)构造函数注入

优点:能注入一个final修饰的属性;注入的对象一旦设定就不会被改变。;能保证依赖在对象构建时就完全初始化,更加安全;通用性好

缺点:注⼊多个对象时, 代码会⽐较繁琐

3)setting注入

优点:灵活,允许在对象实例化后重新配置或注入依赖

缺点:不能注入一个final修饰的属性;因为 Setter 方法可以被多次调用,所以注入的对象有被修改的风险,可能导致状态不稳定。

6.常⻅注解有哪些? 分别是什么作⽤?

web url映射: @RequestMapping

参数接收和接⼝响应: @RequestParam, @RequestBody, @ResponseBody

bean的存储: @Controller, @Service, @Repository, @Component, @Configuration,@Bean

bean的获取: @Autowired, @Qualifier, @Resource

7.@Autowired 和 @Resource 区别

1)@Autowired 是Spring的"亲儿子",默认根据类型匹配。

2)@Resource 是Java标准注解,默认根据名字匹配。在非Spring环境中也能使用,通用性更好。

特性 @Autowired @Resource
默认注入方式 按类型 (byType) 按名称 (byName)
名称指定 需结合 @Qualifier 注解 直接使用 name 属性 (如 @Resource(name="beanName"))
相关推荐
Csvn3 小时前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
小林ixn3 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn4 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave4 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
圣光SG4 小时前
Servlet学习笔记
笔记·学习·servlet
Ai_easygo5 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香5 小时前
分析制作html页面,如何划分页面结构
前端
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言