[Spring Framework]核心概念(IOC/DI、IOC容器和Bean)、IOC初次使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 核心概念(IOC/DI、IOC容器和Bean)、IOC初次使用

@[TOC]

现在的项目中所遇到的问题

在这里插入图片描述
业务层需要调用数据层的方法,就需要在业务层new数据层的对象。如果数据层的实现类发生变化,那么业务层的代码也需要跟着改变,发生变更后,都需要进行编译打包和重部署:
在这里插入图片描述
所以,现在代码在编写的过程中存在的问题是:==耦合度偏高==

针对这个问题,该如何解决呢?
在这里插入图片描述
我们就想,如果能把框中的内容给去掉,不就可以降低依赖了么,但是又会引入新的问题,去掉以后程序能运行么?

答案肯定是不行,因为bookDao没有赋值为Null,强行运行就会出空指针异常。

所以现在的问题就是,业务层不想new对象,运行的时候又需要这个对象,该咋办呢?

针对这个问题,Spring就提出了一个解决方案:

  • 使用对象时,在程序中不要主动使用new产生对象,转换为由==外部==提供对象

    这种思想其实就是ioc

这种实现思想就是Spring的一个核心概念

IOC

==IOC(Inversion of Control)控制反转==

使用对象时,由主动new产生对象转换为由==外部==提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

业务层要用数据层的类对象,以前是自己 new的, 现在自己不new了,交给 别人[外部]来创建对象, 别人[外部]就反转控制了数据层对象的创建权,这种思想就是控制反转

==我们可以说IOC存在的意义就是解耦==

那么Spring技术跟IOC有什么关系呢?

Spring对IOC这个思想进行了实现!Spring提供了一个容器,称为==IOC容器==,用来充当IOC思想中的"外部"。IOC思想中的别人[外部]指的就是Spring的IOC容器。

这个==IOC容器==有人也称为Spring容器,它其实就对应着下图中的core container:
在这里插入图片描述

也就是说先前我们的代码中创建对象全靠new:
在这里插入图片描述
而现在创建对象我们不用管了,全部交给IOC容器:
在这里插入图片描述

IOC容器的作用:负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象。

但是现在如果我们的程序运行的话时会报错的!加入现在它为我们在业务层创建了一个Service对象,但是Service对象依赖着Dao对象,否则根本无法运行。IOC容器中虽然有service和dao对象,但是service对象和dao对象没有任何关系,需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系:
在这里插入图片描述

DI

==DI(Dependency Injection)依赖注入==:在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

像这种在容器中建立对象与对象之间的绑定关系就要用到DI

业务层要用数据层的类对象,以前是自己 new的,现在自己不new了,靠 别人[外部其实指的就是IOC容器]来给注入进来,这种思想就是依赖注入

介绍完Spring的IOC和DI的概念后,我们会发现这两个概念的最终目标就是:==充分解耦==,具体实现靠:

  • 使用IOC容器管理bean(IOC)
  • 在IOC容器内将有依赖关系的bean进行关系绑定(DI)
  • 最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系.

Bean

被创建或被管理的对象在IOC容器中统称为==Bean==

也就是说IOC容器中放的就是一个个的Bean对象

IOC初次使用(XML版)

步骤①:创建maven项目
在这里插入图片描述
步骤②:添加Spring的依赖jar包

在pom.xml文件中(也就是项目配置文件中)将下面的代码粘进去:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

步骤③:添加案例中需要的类

创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类。(两个接口,两个实现类)

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
添加完后我的项目结构:
在这里插入图片描述

步骤④:添加spring配置文件并在配置文件中完成bean的配置

resources下添加spring配置文件applicationContext.xml,并完成bean的配置:
在这里插入图片描述

在Spring的配置文件中,使用bean标签标示配置bean,其中id属性标示给bean起名字,class属性表示给bean定义类型(==这里的类型使用全类名==)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!--bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>

</beans>
注意事项:bean定义时id属性在同一个上下文中(配置文件)不能重复

步骤⑤:获取IOC容器

使用Spring提供的接口完成IOC容器的创建

记得传入Spring的配置文件

public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    }
}

步骤⑥:从容器中获取对象进行方法调用

在容器中拿出来的对象均为Object类型,需要我们进行强转

public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

总结:
(1)Spring是使用容器来管理bean对象的,那么管什么?

  • 主要管理项目中所使用到的类对象,比如(Service和Dao)

(2)如何将被管理的对象告知IOC容器?

  • 使用配置文件

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

  • Spring框架提供相应的接口

(4)IOC容器得到后,如何从容器中获取bean?

  • 调用Spring框架提供对应接口中的方法
相关文章
|
28天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
20天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
73 0
|
2月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
48 0
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
183 2
|
4月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
19天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
28 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
15天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
28 2
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
58 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块