Spring IOC详解

文章目录

目录

文章目录

前言

一 . SpringFramework介绍

1.1 Spring和SpringFramework概念

1.2 SpringFramework主要功能模块

二 . Spring IOC容器和核心概念

2.1 组件和组件管理

2.1.1 什么是组件?

2.1.2 组件管理

2.2 Spring IOC容器和容器实现

2.2.1 Sprign IOC容器介绍

 2.2.2 Spring IOC 容器接口和实现类

2.2.3 spring IOC 容器配置方式 

2.3 SprignIOC/DI概念总结

三 . Spring IOC实践和应用

3.1 基于xml文件配置组件管理

3.1.1 组件信息声明配置(IOC)

3.1.2 组件依赖注入配置(DI)

3.1.3 IOC容器的创建和使用

3.1.4 组件作用域和周期方法配置

3.1.5 FactoryBean的特性和使用

3.2 基于注解方式管理bean

3.2.1 bean注解标记和扫描(IOC)

1.注解理解

2.扫描理解

3.组件添加标记注解

4.配置文件 配置注解生效包的信息(扫描范围)

3.2.2 组件作用域和周期方法注解

3.2.3 Bean属性赋值(DI)

3.3 基于配置类方式管理bean(完全注解开发)

总结


前言

大家好,这篇博客给大家介绍一下spring框架中的ioc容器


在这里先问大家两个问题

为什么要学spring?

Spring IOC详解_第1张图片

 现在企业及项目大部分都用到了spring,我们这是属于紧跟时代潮流,不学不行

spring学什么?

Spring IOC详解_第2张图片

一 . SpringFramework介绍

1.1 Spring和SpringFramework概念

广义的 Spring:Spring 技术栈(全家桶)

广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。

经过十多年的发展,Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。

这些子项目涵盖了从企业级应用开发到云计算等各方面的内容,能够帮助开发人员解决软件发展过程中不断产生的各种实际问题,给开发人员带来了更好的开发体验。

Spring IOC详解_第3张图片

狭义的 Spring:Spring Framework(基础框架)

狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。

Spring Framework(Spring框架)是一个开源的应用程序框架,由SpringSource公司开发,最初是为了解决企业级开发中各种常见问题而创建的。它提供了很多功能,例如:依赖注入(Dependency Injection)、面向切面编程(AOP)、声明式事务管理(TX)等。其主要目标是使企业级应用程序的开发变得更加简单和快速,并且Spring框架被广泛应用于Java企业开发领域。

Spring全家桶的其他框架都是以SpringFramework框架为基础!

1.2 SpringFramework主要功能模块

SpringFramework框架结构图

Spring IOC详解_第4张图片

功能模块 功能介绍
Core Container 核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。
AOP&Aspects 面向切面编程
TX 声明式事务管理。
Spring MVC 提供了面向Web应用程序的集成功能。

二 . Spring IOC容器和核心概念

2.1 组件和组件管理

2.1.1 什么是组件?

组件是可以重复使用的java对象,对象不一定是组件,但组件一定是java对象,三层架构就是由组件组成

Spring IOC详解_第5张图片

2.1.2 组件管理

 在我们普通的web项目中,组件都是由我们自己来创建,赋值,这么做就会导致一个问题

什么问题? 耦合度高 我们做的项目是要追求低耦合,高内聚的

Spring IOC详解_第6张图片

我们会把所有的组件统一交给springioc容器进行管理

2.2 Spring IOC容器和容器实现

2.2.1 Sprign IOC容器介绍

Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。

Spring IOC详解_第7张图片

 2.2.2 Spring IOC 容器接口和实现类

spring容器接口

 BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口

ApplicationContext 是 BeanFactory 的子接口。它扩展了以下功能:

  •  更容易与 Spring 的 AOP 功能集成
  •  消息资源处理(用于国际化)
  •  特定于应用程序给予此接口实现,例如Web 应用程序的 WebApplicationContext

简而言之, BeanFactory  提供了配置框架和基本功能,而 ApplicationContext 添加了更多特定于企业的功能。 ApplicationContext 是 BeanFactory  的完整超集!

ApplicationContext接口实现类

Spring IOC详解_第8张图片

类型名 简介
ClassPathXmlApplicationContext 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
AnnotationConfigApplicationContext 通过读取Java配置类创建 IOC 容器对象
WebApplicationContext 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

2.2.3 spring IOC 容器配置方式 

Spring框架提供了多种配置方式:XML配置方式、注解方式和Java配置类方式

1. XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。
2. 注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。
3. Java配置类方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。


2.3 SprignIOC/DI概念总结

IOC容器

Spring IoC 容器,负责实例化、配置和组装 bean(组件)核心容器。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。

Spring IOC详解_第9张图片

Ioc(Inversion of control) 控制反转

IoC 主要是针对对象的创建和调用控制而言的,也就是说,当应用程序需要使用一个对象时,不再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理,即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。这种方式基本上是通过依赖查找的方式来实现的,即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象。

Spring IOC详解_第10张图片

DI(dependency Injection) 依赖注入

DI 是指在组件之间传递依赖关系的过程中,将依赖关系在容器内部进行处理,这样就不必在应用程序代码中硬编码对象之间的依赖关系,实现了对象之间的解耦合。在 Spring 中,DI 是通过 XML 配置文件或注解的方式实现的。它提供了三种形式的依赖注入:构造函数注入、Setter 方法注入和接口注入。


三 . Spring IOC实践和应用

步骤:

  1. 配置元数据(xml文件,注解,配置类)
  2. 实例化ioc容器
  3. 获取bean(组件)

流程图

Spring IOC详解_第11张图片

3.1 基于xml文件配置组件管理

3.1.1 组件信息声明配置(IOC)

思路:

Spring IOC详解_第12张图片

 我们平时实例化对象可以通过构造方法进行实例化,也可以通过工厂模式实例化

但是这两种方式的配置并不完全相同,我们一一来看

通过无参构造方法实例化组件

Spring IOC详解_第13张图片

 编写xml配置文件

Spring IOC详解_第14张图片

通过静态工厂实例化组件 

Spring IOC详解_第15张图片

  • class属性:指定工厂类的全限定符!
  • factory-method: 指定静态工厂方法,注意,该方法必须是static方法

 通过实例工厂实例化组件 

Spring IOC详解_第16张图片

  • factory-bean属性:指定当前容器中工厂Bean 的名称。
  • factory-method:  指定实例工厂方法名。注意,实例方法必须是非static的! 

上面的配置意思就是先让工厂类成为ioc容器中的组件,在通过该组件中的方法实例化别的组件


3.1.2 组件依赖注入配置(DI)

思路:

Spring IOC详解_第17张图片

1.基于构造函数的依赖注入

 准备组件类

public class UserDao {
}


public class UserService {
    
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

 编写配置文件

Spring IOC详解_第18张图片

Spring IOC详解_第19张图片

只要IOC容器中的组件绑定了依赖关系,那么被依赖的组件会被IOC容器自动注入引用该组件的组件身上


2.基于setter方法的依赖注入

准备组件类

public Class MovieFinder{

}

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  
  private String movieName;

  public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
  }
  
  public void setMovieName(String movieName){
    this.movieName = movieName;
  }

}

 编写配置文件

Spring IOC详解_第20张图片

 setMovieFinder->moveFinder

serMovieName->movieName


总结:

依赖注入(DI)包含引用类型和基本数据类型,同时注入的方式也有多种!主流的注入方式为setter方法注入和构造函数注入,两种注入语法都需要掌握!

需要特别注意:引用其他bean,使用ref属性。直接注入基本类型值,使用value属性。


3.1.3 IOC容器的创建和使用

    @Test
    public void TestIOCCreate(){
        //方式1:实例化并且指定配置文件
        //参数:String...locations 传入一个或者多个配置文件
        ClassPathXmlApplicationContext context1 =
                       new ClassPathXmlApplicationContext("spring.xml","Spring2.xml");

        //方式2:先实例化,再指定配置文件,最后刷新容器触发Bean实例化动作
        ClassPathXmlApplicationContext context2 = new ClassPathXmlApplicationContext();
        //设置配置配置文件,方法参数为可变参数,可以设置一个或者多个配置
        context2.setConfigLocations("spring.xml","Spring2.xml");
        //后配置的文件,需要调用refresh方法,触发刷新配置
        context2.refresh();
    }

获取bean

Spring IOC详解_第21张图片


3.1.4 组件作用域和周期方法配置

周期方法

我们先来回顾一下Servlet周期方法

Spring IOC详解_第22张图片

1. 周期方法概念

    我们可以在组件类中定义方法,然后当IoC容器实例化和销毁组件对象的时候进行调用!这两个方法我们成为生命周期方法!

    类似于Servlet的init/destroy方法,我们可以在周期方法完成初始化和释放资源等工作。

2.周期方法声明

Spring IOC详解_第23张图片

3.周期方法配置 

Spring IOC详解_第24张图片

 组件作用域

1. Bean作用域概念

     标签声明Bean,只是将Bean的信息配置给SpringIoC容器!

    在IoC容器中,这些标签对应的信息转成Spring内部 BeanDefinition对象,BeanDefinition 对象内,包含定义的信息(id,class,属性等等)!

    这意味着,BeanDefinition概念一样,SpringIoC容器可以可以根据 BeanDefinition对象反射创建多个Bean对象实例。

    具体创建多少个Bean的实例对象,由Bean的作用域Scope属性指定!

2.作用域可选值

常用

取值 含义 创建对象的时机 默认值
singleton 在 IOC 容器中,这个 bean 的对象始终为单实例 IOC 容器初始化时
prototype 这个 bean 在 IOC 容器中有多个实例 获取 bean 时

在WebApplicationContext环境下(不常用) 

取值 含义 创建对象的时机 默认值
request 请求范围内有效的实例 每次请求
session 会话范围内有效的实例 每次会话

3.1.5 FactoryBean的特性和使用

Spring IOC详解_第25张图片

1.FactoryBean介绍 

FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。

用于配置复杂的Bean对象,可以将创建过程存储在FactoryBean 的getObject方法!

FactoryBean接口提供三种方法:

T getObject(): 

    返回此工厂创建的对象的实例。该返回值会被存储到IoC容器!
boolean isSingleton()

    如果此 FactoryBean 返回单例,则返回 true,否则返回 false 。此方法的默认实现返回 true (注意,lombok插件使用,可能影响效果)。
Class getObjectType(): 返回 getObject() 方法返回的对象类型,如果事先不知道类型,则返回 null 。

Spring IOC详解_第26张图片

2. FactoryBean使用场景

  • 代理类的创建
  • 第三方框架整合
  • 复杂对象实例化等 

3.FactoryBean和BeanFactory区别

    FactoryBean 是 Spring 中一种特殊的 bean,可以在 getObject() 工厂方法自定义的逻辑创建Bean!是一种能够生产其他 Bean 的 Bean。FactoryBean 在容器启动时被创建,而在实际使用时则是通过调用 getObject() 方法来得到其所生产的 Bean。因此,FactoryBean 可以自定义任何所需的初始化逻辑,生产出一些定制化的 bean。

    一般情况下,整合第三方框架,都是通过定义FactoryBean实现!!!

    BeanFactory 是 Spring 框架的基础,其作为一个顶级接口定义了容器的基本行为,例如管理 bean 的生命周期、配置文件的加载和解析、bean 的装配和依赖注入等。BeanFactory 接口提供了访问 bean 的方式,例如 getBean() 方法获取指定的 bean 实例。它可以从不同的来源(例如 Mysql 数据库、XML 文件、Java 配置类等)获取 bean 定义,并将其转换为 bean 实例。同时,BeanFactory 还包含很多子类(例如,ApplicationContext 接口)提供了额外的强大功能。

    总的来说,FactoryBean 和 BeanFactory 的区别主要在于前者是用于创建 bean 的接口,它提供了更加灵活的初始化定制功能,而后者是用于管理 bean 的框架基础接口,提供了基本的容器功能和 bean 生命周期管理。


3.2 基于注解方式管理bean

Spring IOC详解_第27张图片

3.2.1 bean注解标记和扫描(IOC)

1.注解理解

和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。

本质上:所有一切的操作都是 Java 代码来完成的,XML 和注解只是告诉框架中的 Java 代码如何执行。

2.扫描理解

Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注解进行后续操作。

3.组件添加标记注解
注解 说明
@Component 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。
@Repository 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
@Service 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
@Controller 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

Spring IOC详解_第28张图片 

通过查看源码我们得知,@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。

对于Spring使用IOC容器管理这些组件来说没有区别,也就是语法层面没有区别。所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。

4.配置文件 配置注解生效包的信息(扫描范围)

基本扫描配置

Spring IOC详解_第29张图片

 只有在包扫描范围之内添加了以上四个注解的组件才会被放入ioc容器

指定排除组件

Spring IOC详解_第30张图片 指定只扫描组件

Spring IOC详解_第31张图片


3.2.2 组件作用域和周期方法注解

Spring IOC详解_第32张图片

Spring IOC详解_第33张图片


3.2.3 Bean属性赋值(DI)

Spring IOC详解_第34张图片

Spring IOC详解_第35张图片


3.3 基于配置类方式管理bean(完全注解开发)

Spring 完全注解配置(Fully Annotation-based Configuration)是指通过 Java配置类 代码来配置 Spring 应用程序,使用注解来替代原本在 XML 配置文件中的配置。相对于 XML 配置,完全注解配置具有更强的类型安全性和更好的可读性。

Spring IOC详解_第36张图片

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

//标注当前类是配置类,替代application.xml    
@Configuration
//使用注解读取外部配置,替代 

@Configuration指定一个类为配置类,可以添加配置注解,替代配置xml文件

@ComponentScan(basePackages = {"包","包"}) 替代

@PropertySource("classpath:配置文件地址") 替代

第三方Bean如何引入?

Spring IOC详解_第37张图片

 第三方Bean依赖注入

Spring IOC详解_第38张图片

引用类型依赖注入

Spring IOC详解_第39张图片

xml配置与注解方式配置对比

Spring IOC详解_第40张图片


总结

这篇博客主要讲解的方式springioc相关的内容,我们下一篇博客见

你可能感兴趣的:(javaweb,spring,java,后端)