Spring IoC 容器

IoC(控制反转)概念

控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责,这样控制权就由应用转移到外部容器,控制权的转移就是所谓的反转(控制权转移带来的好处就是降低了业务对象之间的依赖程度)

image-20210925142439639

DI(依赖注入)概念

依赖注入就是对象之间的依赖关系是在运行时动态注入的(本质是利用 Java 的反射机制)

依赖注入分类
  • 构造器注入
  • 方法注入
  • 接口注入

注:Spring 仅支持构造器注入和方法注入

什么是 IoC 容器

IoC 容器是 Spring 框架的核心(Spring core),通过实现 IoC(控制反转)和 DI(依赖注入),以降低类与类之间的依赖程度(低耦合),从而奠定 Spring 框架的基石

IoC 容器 = 依赖注入(DI) + 控制反转(IOC)

什么是 Bean

在 IoC 容器中创建的类实例统称为 Bean( Spring 中使用 Bean 来表示应用组件)

  • Spring 中使用 IoC容器(实现 IoC )来管理 Bean 的生命周期
  • Spring 中使用 Ioc容器(实现 DI )来自动完成 Bean 与 Bean 的依赖关系
BeanFactory 工厂
  • BeanFactory 是 Spring 框架最核心的接口,它提供了高级 IoC 的配置机制。BeanFactory 使管理不同类型的 Java 对象成为可能

BeanFactory 是 Spring 框架的基础设施(属于底层封装组件,专门供 Spring 框架使用)

ApplicationContext (应用上下文)
  • ApplicationContext 是建立在 BeanFactory 基础之上,提供了更多面向应用的功能。一般称BeanFactory为IoC容器,而称ApplicationContext 为应用上下文

ApplicationContext 面向 Spring 框架的开发者(属于上层封装组件,专门供开发者使用)

IoC 容器三种创建方式
  • ClassPathXmlApplication:从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源
  • FileSystemXmlApplicationContext:读取文件系统下的XML配置文件并加载上下文定义
  • XmlWebApplicationContext:读取Web应用下的XML配置文件并加载上下文定义
装配 Bean

装配 Bean 就是在 IoC 容器中创建 Bean( IoC,控制反转)以及确定 Bean 与 Bean 之间的依赖关系(DI,依赖注入)

Spring 支持三种装配 Bean 的方式

  • 基于 XML 配置
  • 基于注解
  • 基于 Java 类配置
构造器注入 Bean

Spring IoC 容器构造器注入 Bean 使用 元素,使 Spring IoC 容器在实例化 Bean 时可以不调用默认构造器,而是调用有参构造器

装配单例模式 Bean

Spring IoC 容器支持通过 元素的 属性来装配调用静态方法实例化的 Bean

Bean 的作用域

在 Spring IoC 容器中,所有的 Bean 默认都是单例,当 IoC 容器装配一个 Bean 时通过调用容器的 getBean ( )方法,总是返回 Bean 的同一个实例( Bean 的默认作用域为单例模式,singleton)

image-20210925143237467

Bean 的初始化和销毁

Spring通过在 元素中配置 init-method 和 destroy-method 属性为 Bean 定义初始化和销毁操作

  • init-method 属性:指定在初始化 Bean 时要调用的方法
  • destroy-method 属性:指定在 Bean 从容器移除之前要调用的方法

如果声明的很多 Bean 都拥有相同的初始化方法名和销毁方法名,可以使用 根元素的 default-init-method 和 default-destory-method 属性

  • default-init-method 属性:为应用上下文中所有的 Bean 设置一个共同的初始化方法
  • default-destory-method 属性:为应用上下文中所有的 Bean 设置一个共同的销毁方法
方法注入 Bean

Spring IoC 容器的 Bean 方法注入是利用 Bean 属性的 set 方法来配置属性的值,以实现 setter 方式的注入(Bean 方法注入使用 子元素配置)

内部注入 Bean

内部 Bean 的概念类似于 Java 的内部类,即内部 Bean 是定义在其他 Bean 内部的 Bean(内部注入 Bean 包括构造器注入和方法注入两种方式)

内部 Bean 的特点是不能被复用(内部 Bean 仅适用于一次注入,而且不能被其他 Bean 所引用)

属性命名空间

元素

属性命名空间

元素是 Spring IoC 容器提供的另一种 Bean 属性的装配方式,该方式用于简化属性的配置,其作用与 元素相同

<!-- 未使用 p 元素-->
<bean id = “user”class=“com.dtinone.beans.User”>
    <property name=“name” value =“张三”/>
    <property name=“age”    value = “29”  /> 
</bean>

<!-- 使用 p 元素 -->
<bean id = “user”class=“com.dtinone.beans.User”
    p:name = “张三”
    p:age    = “29”  
/> 
装配集合 Bean

使用 Spring 除了配置基本类型和引用类型属性,还支持集合属性的配置

Spring提供了 4 种类型的集合属性元素:

image-20210925143618792

装配空值

除了为 Bean 的属性或构造器参数装配基本类型或引用类型外,Spring IoC 容器还支持装配一个空值 NULL

  • 装配空值主要应用于某些特殊情况下,Bean 会为它的属性默认设置一个非空值,而装配时又想不希望使用默认设置值,那么就可以显式地为该属性装配一个空值 NULL
<property name=“propertyName”><null/></property>
简化装配 Bean

Spring 提供两种方式,可以帮助我们简化 XML 配置方式装配 Bean,这两种方式分别是自动装配和自动检测

自动装配

用于减少甚至消除配置 元素和 元素,让 Spring 自动识别如何装配 Bean 的依赖关系

自动装配需要设置 的 autowire 属性,其属性值为自动装配的类型

image-20210925143853243

注意:每一种自动装配类型各有优缺点,需要根据情况使用

默认自动装配 Bean

如果需要为 Spring 应用上下文中的每一个 Bean 配置相同的自动装配 autowire 属性,那么就可以在根元素 上增加一个 default-autowire 属性

  • 默认情况下,default-autowire 属性被设置为 no,表示所有 Bean 都不使用自动装配
  • 对某个 Bean 选择了自动装配类型,仍然可以对该 Bean 的某些属性进行显式装配,Spring IoC 容器会根据显式装配和自动装配的优先级选择装配策略

默认自动装配 < 自动装配 < 手动装配

注解装配 Bean

使用注解自动装配与在 XML 配置中使用 autowire 属性自动装配并没有太大差别(Spring IoC容器默认禁用注解装配 Bean)

  • @Autowired 注解:可以用于标注 setter 方法,Spring 就会尝试对该方法执行 byType 自动装配;还可以用于标注需要自动装配 Bean 引用的任意方法;还可以用于标注构造器,当创建 Bean 时,即使在XML 文件中没有使用 元素配置Bean,该构造器也需要进行自动装配;还可以用于直接标注属性,则可以删除 setter 方法(@Autowire 注解甚至不受限于private关键字,仍然可以被自动装配)
  • @Resource 注解:与 @Autowired 完全相同,唯一区别是默认安装 byName 装配 Bean,失败则按照 byType 装配 Bean
  • @Qualifier 注解:如果 Spring 有多个适合自动装配的Bean,@Autowired 注解由于无法选择哪一个 Bean 才是真正需要的,这时 Spring 将自动装配失败并抛出异常,这种情况下可以使用 @Qualifier 注解来明确指定需要自动装配的Bean
  • @Scope 注解:可以用于设置 Bean 的作用域
  • @Value 注解:可以用于属性、方法和构造器,作用是设置 Bean 的基本类型属性值
  • @PostConstructor 注解:可以用于设置 Bean 的初始化方法
  • @PreDestroy 注解:可以用于设置 Bean 的销毁方法
自动检测

Spring IoC 容器支持自动检测 Bean 和 定义 Bean,在不使用 元素的情况下,Spring 应用中的大多数甚至所有的 Bean 都能够实现定义和装配

image-20210925144504475

装配基于 Java 类的配置

在Spring IoC 容器装配 Bean 的一种新方式是基于 Java 类的配置(通过 @Configuration 注解和基于方法的 @Bean 注解实现)

  • @Bean 注解:指明方法的实例化,配置和初始化一个对象是通过 Spring 的 IoC 容器来管理的(对于使用以 XML 配置 Spring 的 元素,@Bean 注解和 元素作用相同)
  • @Configuration注解:指明该类主要是作为一个bean的来源定义。此外,@Configurationd 定义的类允许在同一个类中使用 @Bean 定义的方法来定义依赖的bean

举例:

@configuration public class AppConfig  {
	public MyService myService( )  {
	       return new MyServiceImpl( );
	}	 
}

等价于

posted @ 2021-09-29 18:08  追こするれい的人  阅读(61)  评论(0编辑  收藏  举报