【Spring5】IOC容器与解耦合(上)

简介: 文章目录1 IOC的概念与刨析1.1 IOC简介1.2 IOC底层原理1.3 IOC容器1.3.1 何为容器?1.3.2 IOC容器的理解2 IOC操作Bean管理2.1 Bean管理2.2 Bean管理xml形式2.2.1 创建对象与注入过程2.2.2 注入空值和特殊符号2.2.3 注入属性2.2.3.1 外部bean与内部bean2.2.3.2 注入集合2.3 工厂Bean2.4 Bean的作用域2.5 Bean的生命周期2.6 xml自动装配(偷懒的技巧)

1 IOC的概念与刨析

1.1 IOC简介

 控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

 其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫依赖查找(Dependency Lookup)。

 通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。


通俗一点,解释如下:


控制反转,把对象的创建和对象之间调用的过程交给Spring进行管理;

使用IOC目的:为了降低耦合度。

1.2 IOC底层原理

所谓使用IOC的目的就是为了降低耦合度,在软件工程概论中我们知道,衡量一个软件设计好坏的标准,是 高耦合、低内聚。


因此,在刨析IOC底层原理的时候,我们不妨一步步来观察如何将代码之间耦合度慢慢降低


传统方式:


对象UserService依赖于对象User,即对象UserService在初始化或者运行到某一点的时候, 自己必须主动去创建对象User或者使用已经创建的对象User,控制权始终在自己手上。耦合度高! 两个对象关系过于紧密,当User的路径或者User中方法变了,UserService也会跟着变,所谓 牵一发而动全身 就是这个道理。


工厂模式:


通过一个UserFactory工厂,完成了对象的创建操作,降低了UserService和User之间的耦合度, 可是工厂和对象之间还是存在耦合度。 其实,完全消除耦合度是不可能的,只能降低耦合度。显然,工厂模式不是最优解。



引入IOC:


IOC底层原理涉及到xml解析、工厂模式与反射机制。IOC过程如下:


在xml配置文件中配置创建的对象;

<bean id="user" class="com.hxh.User"></bean>
1

假设还是有UserService与User类,想要在UserService类中调用User的方法,因此创建一个UserFactory工厂类,进行具体的操作,与上面讲解不同的是,这里不再直接返回一个对象,而是通过xml解析和反射的方式 做到进一步降低耦合度:

public class UserFactory {
    public static User getUser() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //1.xml解析
        //String classValue = class属性值;
        //2.通过反射创建对象
        Class<?> clazz= Class.forName("com.hxh.User");
        return (User) clazz.newInstance();
    }
}

此时,如果User的路径发生了更改,只需要更改xml文件中的配置,实现了耦合度进一步降低。


1.3 IOC容器

1.3.1 何为容器?

容器的核心是Bean,是豆荚的意思,我们的对象都被装在这个豆荚里统一管理。 可以理解成钞票是你的对象,而你需要把它存储在银行,让银行帮你打理,等你需要钱的时候,银行根据你的需要再把钱打给你… …(我可真是小财迷!)


而在xml里配置的


bean、@repository、 @service、@controller、@component


可以理解成抽象的 map (id-class),在项目启动的时候会读取配置文件里面的bean节点,根据全类名使用反射创建对象放到map里、扫描到打上上述注解的类也是通过反射创建对象放到map里。

此时,map中就放入了我们的对象,接下来我们在代码里需要用到里面的对象时,会通过依赖注入(DI)注入(autowired.resource等注解, xml里bean节点内的ref属性,项目启动的时候会读取xm|节点ref属性根据id注入,也会扫描这些注解,根据类型或id注入)。


1.3.2 IOC容器的理解

IOC思想基于IOC容器完成的,IOC容器的底层是对象工厂


还是再IOC底层原理举的例子,IOC容器会主动创建一个对象User注入到对象UserService需要的地方,从而让User和UserService失去了直接联系。 图示如下:



通过图可以看出来,全部对象的控制权全部上缴给"第三方"IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用, 如果没有这个"粘合剂",对象与对象之间会彼此失去联系。


Spring提供了IOC容器实现的两种方式(接口):


  1. BeanFactory: IOC基本容器的实现,是Spring内部的接口,不提供开发人员进行使用。加载配置文件的时候,不会创建对象,只有在使用的时候才去创建。
  2. ApplicationContext: BeanFactory接口的子接口,提供了更多更强的功能,一般由开发人员使用。加载配置文件的时候就会把配置文件对象进行创建。

2 IOC操作Bean管理

2.1 Bean管理

Bean管理指的是两个操作:

(1)Spring 创建对象;

(2)Spring 注入属性


Bean管理操作有两种方式

方式一:基于xml配置文件实现

方式二:基于注解的方式实现


2.2 Bean管理xml形式

2.2.1 创建对象与注入过程

一.创建对象

在spring配置文件中,使用bean标签,标签里面添加对应的属性,就可以实现对象的创建。


<bean id="user" class="com.hxh.User"></bean>
1

在bean标签中,有许多常用的属性:

属性 含义
id 获取对象的唯一标识
class 类全路径
name 与id基本相同,区别是name可以有特殊字符


创建对象,默认执行无参构造方法。

二.注入属性

与JavaSE一样,支持set注入和有参构造注入两种方式。

演示使用set方法进行属性的注入

1.首先创建一个类,类中含有对应的属性和set方法,以Book类为例!

public class Book {
    //创建属性
    private String bname; //书名
    private String bauthor; //作者
    //对应的set
    public void setBname(String bname) {
        this.bname = bname;
    }
    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }
    //为了测试方便
    public void testDemo(){
        System.out.println(bauthor + "--" + bname);
    }
}


相关文章
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
441 2
|
6月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
197 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
7月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
4月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
839 108
|
5月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
456 57