前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JAVAEE一>Spring IoC和DI详解

JAVAEE一>Spring IoC和DI详解

作者头像
用户11305962
发布于 2025-02-24 00:30:45
发布于 2025-02-24 00:30:45
9600
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

Spring容器说明:

Spring 就是⼀种IoC容器,Spring 容器 管理的主要是对象, 这些对象, 我们称之为"Bean". 我们把这些对象交由Spring管理, 由 Spring来负责对象的创建和销毁. 我们程序只需要告诉Spring, 哪些需要存, 以及如何从Spring中取出对象

把对象交给Spring管理,需要添加一些注解这里共有两类注解可以使用: 1.类注解:@Controller,@Service,@Repository,@Component,@Configuration

2.方法注解:@Bean

我们接下来就主要围绕注解的使用来讲解

Ioc容器优势:

1.控制权发生反转:不在需要使用方,创建对象并控制依赖,不需要自己创建对象和初始化,这就是控制反转

2.集中资源管理: IOC容器会帮我们管理一些资源(对象)时, 只需要从IoC容器中去取 就可以了


3.降低资源的耦合度:我们在创建实例的时候不需要了解其中的细节, 降低了使用资源双方的依赖程度

DI介绍:

DI就是注入依赖,容器在运行时动态的为程序注入所需的依赖 依赖就是程序运行时需要的一些成员属性

从Spring获取对象:

因为对象被交给了Spring管理,所以我们要先获取Spring的上下文->ApplicationContext,再来根据方法获取对象

获取对象的方法:

这里我们主要根据名称获取,这个名称是唯一的,根据类型获取,这个类型就是某个类,根据名称+类型获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. 根据bean名称获取bean
 Object getBean(String var1) throws BeansException;
 // 2. 根据bean名称和类型获取bean
 <T> T getBean(String var1, Class<T> var2) throws BeansException;
 // 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的bean
 Object getBean(String var1, Object... var2) throws BeansException;
 // 4. 根据类型获取bean
 <T> T getBean(Class<T> var1) throws BeansException;
 // 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的
bean
 <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

关于上下文的概念:

比如线程上下文:一个栈结构,用于存储上层线程的上下文信息,以便继续执行。 包含当前线程的位置、设置、本地变量等信息。类似于一个环境和这里的Spring容器的上下文, 就是指当前的运行环境, 也可以看作是⼀个容器, 容器里存了很多内容, 这些内容是当前 运行的环境**

@Controller注解(控制层:接收参数并响应):

使用@Controller 存储对象(bean):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Controller;

@Controller
public class HelloController {
    public void print(){
        System.out.println("do Controller");
    }
}

用名称获取对象:就是把对象交给Spring容器管理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
        //获取Spring上下文
       ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);

       HelloController bean1 = (HelloController) context.getBean("helloController");
       bean1.print();

用类型获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 HelloController bean2 = context.getBean(HelloController.class);
       bean2.print();

使用类型和名称获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HelloController bean3 = context.getBean("helloController",HelloController.class);
        bean3.print();

@Service注解(业务逻辑层:处理业务数据):

存储对象代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void print(){
        System.out.println("do Service");
    }
}

使用类型获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 UserService bean7 = context.getBean(UserService.class);
        bean7.print();

@Repository注解(数据层:调用数据库用来获取数据):

存储对象代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public void print(){
        System.out.println("do Repository");
    }
}

使用类型获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UserRepository bean6 = context.getBean(UserRepository.class);
        bean6.print();

@Configuration注解(配置层):

存储对象代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.annotation.Configuration;

@Configuration("reNameBean")
public class UserConfig {

    public void print(){
        System.out.println("do config");
    }
}

使用类型获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UserConfig bean4 = context.getBean(UserConfig.class);
        bean4.print();

@Component注解在(组件层):

存储对象代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    public void print(){
        System.out.println("do Component");
    }
}

使用类型获取对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UserComponent bean8 = context.getBean(UserComponent.class);
        bean8.print();

@Bean注解(方法注解):

注意:方法注解使用时候注意要搭配以上的五大类注解使用:


Bean这个注解使用的场景:一个类需要多个对象:(上面的五大注解,只可以有一个对象)


以上五大注解和这个类注解都可以修改,对象的名字,就是让Spring按照我们的名字管理

查看对象:按照修改的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student bean9 = (Student) context.getBean("ss1");
        System.out.println(bean9);

        Student bean10 = (Student) context.getBean("s2");
        System.out.println(bean10);

上面五大注解和方法注解的区别:

除了控制层必须使用注解(@Controller)之外,其他四个注解都可以替换使用,但是一般规范来说都在各自的层级使用


控制层使用其他注解有时候可以使用成功但是不稳定不规范


注解细节:

bean–>对象的命名规则:

从Spring容器获取对象时,通过名称获取就需要命名:


五大类注解: 以小驼峰命名,如果类名前两个字母为大写那么就是这个类名本身


bean注解: 方法注解要搭配类注解使用,命名默认为方法名

Spring扫描路径:

Spring扫描路径是启动类所在路径,的子路径及子孙路径一直往后扫描


修改后演示:

发现其路径,刚开始的”HelloController“都启动不了:


也可以通过注解手动修改启动类路径:@ComponentScan

什么是DI:

DI就是依赖注入,它是一个过程,就是把Spring管理的依赖就是对象,拿出来再注入到指定的属性中

DI的常用方法:

1.属性注入:

通过注解@Autowired来实现:




结果:

2.构造方法注入:

构造方法注入需要注意: 当有一个构造方法时,没得选可以注入成功,但是有多个构造方法时注入由于反射机制去获取无参数的构造方法


有多个构造方法时,由于反射机制,会去选择无参数的构造方法导致对象没有注入


这个时候就需要加上@Autowired注解,选中使用的构造方法:

3.set方法注入:

在set方法加上@Autowired注解就行:

@Autowired存在的问题:

@Autowired注解通过类型来找到对象,如果有多个对象,就会报错:因为@Autowired注解首先按照类型来找对象的,找到多个对象不知道使用哪个

解决措施:
1.加上@Qualifier注解进一步通过名称来找bean:

@Qualifier注解不能单独使用,必须配合@Autowired使用


2.加上@Primary注解:

@Primary,没有参数,所以使用在多个对象那一级来指定


指定:

3.加上@Resource注解:

@Resource注解:直接通过name属性来指定要注入的bean名称:

面试题:@Resource和@Autowired的区别:

面试官喜欢听到的回答:按照类型来 1.@Autowird注解是Spring提高的注解,而@Resource注解是jdk提供的 2.@Resource按照名称注入,@Autowired按照类型注入,@Resource支持更多参数设置,按照name属性来找bean


拓展:@Resource不完全按照名称查找,也需要在类型的基础上按照名称查找

@Autowired的装配顺序:

首先按照类型找bean,找不到抛异常,找到一个装配;如果找到多个对象时按照@Qualifier查找,我们找到@Qualifier是按照名称来找bean的,所以@Autowired准确来说是按照“类型+名称”来注入对象的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《JavaEE进阶》----11.<SpringIOC&DI【Spring容器+IOC详解+DI介绍】>
1.资源集中管理:IOC容器会帮我们管理一些资源(对象等)。我们使用时,从IOC容器取就可以了。
用户11288958
2024/09/24
1400
《JavaEE进阶》----11.<SpringIOC&DI【Spring容器+IOC详解+DI介绍】>
Spring之IOC容器
spring core提供了IOC,DI,Bean配置装载创建的核心实现 核心概念: Beans、BeanFactory、BeanDefinitions、ApplicationContext
冬天vs不冷
2025/01/21
2380
Spring之IOC容器
【Spring】Spring IOC&DI:架构旋律中的“依赖交响”与“控制华章”
通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因.但是这个概念相对来说, 还是⽐较抽象.
用户11288949
2025/01/17
820
【Spring】Spring IOC&DI:架构旋律中的“依赖交响”与“控制华章”
【Spring】IoC和DI,控制反转,Bean对象的获取方式
通过前面的学习,我们了解到Spring是一个含有多种工具和方法的IoC容器,那么什么是容器,神什么是IoC容器呢?
三三是该溜子
2024/12/30
820
【Spring】IoC和DI,控制反转,Bean对象的获取方式
Spring-IOC(2)
scope <!--Spring使用scope标签来制定bean的作用域(默认为Singleton)--> <bean id="singletonBean" class="com.fq.instance.SingletonBean" scope="singleton"> </bean> <bean id="prototypeBean" class="com.fq.instance.PrototypeBean" scope="prototype"> </bean> Bean生命周期 Spring初始化/销毁b
Java帮帮
2018/03/16
6850
Spring-IOC(2)
【Spring】获取Bean对象需要哪些注解
引入:在上一篇文章中,我简单的认识了IoC容器和DI依赖注入,控制反转的基本原理,使用@Controller存储bean对象,以及三种获取bean对象的方式。本篇文章,将继续对bean对象的存储五大注解进行展开
三三是该溜子
2024/12/30
880
【Spring】获取Bean对象需要哪些注解
Spring 5(二)IOC容器
二.IOC 容器 (1)IOC 底层原理 (2)IOC 接口(BeanFactory) (3)IOC 操作 Bean 管理(基于 xml) (4)IOC 操作 Bean 管理(基于注解) 1.基本概念(底层原理) 1.1 什么是 IOC (1)控制反转,把对象的创建和对象之间的调用过程,交给 Spring 进行管理 (2)使用 IOC 的目的:为了耦合度降低 (3)做入门案例就是 IOC 的实现 1.2IOC 底层原理 (1)xml 解析、工厂模式、反射 1.2.1 画图讲解 IOC 底层原理
浅辄
2022/11/23
4500
Spring 5(二)IOC容器
Spring详解(四)------注解配置IOC、DI
  Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的。   前面讲解 IOC 和 DI 都
IT可乐
2018/01/04
6550
Spring详解(四)------注解配置IOC、DI
《JavaEE进阶》----12.<SpringIOC&DI【扫描路径+DI详解+经典面试题+总结】>
虽然我们没有告诉Spring扫描路径是什么,但是有一些注解已经告诉Spring扫描路径是什么了
用户11288958
2024/09/24
790
《JavaEE进阶》----12.<SpringIOC&DI【扫描路径+DI详解+经典面试题+总结】>
Spring 框架基础(02):Bean的生命周期,作用域,装配总结
上面使用 ComponentScan 注解,也可在配置文件进行统一的配置,效果相同,还简化代码。
知了一笑
2019/09/24
4030
Spring IoC容器与Bean管理
从本节开始,我将要学习作为java高级阶段最最最最重要的一个框架体系,名为Spring。Spring是整个Java生态中最重要的一环。因为我也是初学,所以我的概括也不一定全面和精炼。写这一章只是为自己以后复习。
害恶细君
2022/11/22
7370
Spring IoC容器与Bean管理
Spring详解篇之IoC控制反转
一.Spring概况 spring是一个开源框架 是一个轻量的控制反转和面向切面的容器框架 大小和开销都是轻量的。 通过控制反转技术可以达到松耦合的目的 切面编程,允许通过分离应用的业务逻辑。 包含并
方志朋
2017/12/29
1.4K0
spring的IOC和DI
Ioc—Inversion of Control,即“控制反转”,是一种设计思想。而Spring IOC是应用了该设计思想,能过IOC容器来间接管理bean。
逍遥壮士
2020/09/18
7060
spring系列(一)——简介和IOC
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
3780
spring系列(一)——简介和IOC
【Spring】核心部分之IOC:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心IOC,IOC有这一篇足以
第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
小尘要自信
2023/10/10
6460
【Spring】核心部分之IOC:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心IOC,IOC有这一篇足以
Spring核心之控制反转IOC
第一个值默认值,singleton,表示单实例对象 第二个值prototype,表示是多实例对象
用户9615083
2022/12/25
5340
Spring核心之控制反转IOC
【Spring】——Spring简单 读和取
上期我们讲解了Spring的创建与使用,发现将Bean 注册到容器这一步中,如果Bean对象过多,在注册到容器时,我们有几个Bean对象就需要几行注册,在实际开发中这是非常麻烦的,我们需要有更简单的方法去实现这一过程,这便是本篇文章的主题——Spring简单 读和取。
终有救赎
2023/10/16
1890
【Spring】——Spring简单 读和取
3、Spring 之IOC 容器 详解
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。
叫我阿杰好了
2023/10/17
7K0
3、Spring 之IOC 容器 详解
Spring5之IOC
(1) 在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象的创建
OY
2022/02/21
3350
Spring5之IOC
面试必会系列 – 1.8 Spring IOC / AOP原理
这四个注解写在类上面的时候,都可以完成注册bean 的功能,但是这些规定并不是spring识别的依据
全栈程序员站长
2022/07/02
3600
面试必会系列 – 1.8 Spring IOC / AOP原理
相关推荐
《JavaEE进阶》----11.<SpringIOC&DI【Spring容器+IOC详解+DI介绍】>
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验