Spring知识点儿复习IOC

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战


1. Spring概述

1.1 什么是Spring?

Spring是一个开源的松耦合、可配置Java开发框架,根本使命是解决企业级应用开发的复杂性,简化Java开发。它有两个核心特征,控制反转(IoC)面向切面编程(AOP)

1.2 Spring的优点

优点

  • 简化开发,实现解耦
  • AOP编程
  • 声明式事务的支持
  • 方便程序的测试(JUnit4)
  • 可以集成多种框架(Mybatis,Struts等)

1.3 Spring的模块

在这里插入图片描述

  • spring core:提供了框架的基本组成部分,包括IoC和DI功能
  • spring beans:提供了BeanFactory,工厂模式的典型实现
  • spring context:构建于core封装包基础上的context封装包,提供了一种框架式的对象访问方法
  • spring jdbc:提供了一个JDBC的抽象层,用于简化JDBC
  • spring aop:面向切面编程,可以实现拦截器或织入其他功能
  • spring web:提供针对web开发的集成特性
  • spring test:为测试提供支持,支持使用JUnit进行单元测试

1.4 Spring框架中的设计模式

  1. 工厂模式:BeanFactory就是工厂模式的实现,用于创建对象实例
  2. 单例模式:Bean默认为单例模式
  3. 代理模式:AOP功能利用的就是JDK动态代理模式和CgLIb动态代理模式
  4. 模板方法模式:解决代码重复的问题
  5. 观察者模式:应用在事件的监听器处

2. Spring IoC

2.1 什么是Spring IOC容器?

控制反转,它把传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对对象组件的装配和管理,实现解耦

2.2 控制反转的作用

  • 解耦,由容器去维护具体的对象
  • 解决对象间的依赖关系
  • 托管对象大部分的生命周期 “这个大部分我怎么来解释”

2.3 Spring IOC的实现机制

工厂模式 + 反射机制

2.4 BeanFactory和ApplicationContext的区别

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring容器。其中ApplicationContext是BeanFactory的子接口。

  • 依赖关系

BeanFactory:是Spring中最底层的接口,包含了bean的配置和管理机制 ApplicationContext:它是BeanFactory的子接口(强调扩展可不是继承),除了以上功能外,还继承了MessageSource,支持国际化,BeanPostProcessor支持Bean后置处理器,BeanFactoryProcessor支持BeanFactory的后置处理器,支持事件发布ApplicationEvent

  • 加载方式

BeanFactory采用延迟加载的形式来注入Bean,只有在使用到某个bean时,才会对该Bean进行加载实例化。这样,虽然启动性能提高,但是我们不能立即发现Spring配置错误问题。 ApplicationContext,它在容器启动的时候,就一次性创建了所有的Bean,这样我们就能立即发现配置的错误,这样有利于检查所依赖的属性是否注入。

  • FactoryBean:是工厂Bean,是一个接口,用来创建初始化流程比较复杂的对象,默认是单例的,FactoryBean同IOC一起完成初始化,其中的Bean采用的是懒加载机制,注册bean时,只需要注入FactoryBean

若采用静态工厂,那么工厂并不会被注册到IOC容器中,而且一般采用的是Xml文件配置形式,并指定factory-method

2.4.1 ApplicationContext的类型

  • 基于配置文件的,ClassPathXmlApplicationContext
  • 基于注解的,AnnotationConfigApplicationContext

2.4.2 BeanFactory的重要类型

  • AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,还额外实现了AutowireCapableBeanFactory,可以实现自动注入的功能,核心功能:Bean 的创建、属性填充和依赖的自动注入、Bean 的初始化
  • DefaultListableBeanFactory:BeanFactory的落地实现,在AbstractAutowireCapableBeanFactory的基础上,添加注册Bean定义信息,注册动作通过BeanDefinitionRegistry实现

2.4.3 如何理解BeanDefinitionRegistry

BeanDefinitionRegistry是维护BeanDefinition的注册中心,它其中存放了IOC容器中的bean的定义信息,它的默认实现是DefaultListableBeanFactory

2.4.3 三种后置处理器

在这里插入图片描述

  • BeanPostProcessor的扩展

  • InstantiationAwareBeanPostProcessor :作用于 bean 对象的实例化前后,以及属性赋值阶段

  • AutowiredAnnotationBeanPostProcessor :会收集 bean 所属类及 bean 所属类的父类中的自动注入信息,当容器扫描到@Autowired、@Resource和@Injec时,就会在Ioc容器种寻找需要的bean,并装配给该对象的属性

@Autowired和@Resource

  • DestructionAwareBeanPostProcessor :作用于 bean 对象的销毁动作之前

2.5 依赖注入实现方式

  1. Setter方法注入
  2. 构造器注入

在这里插入图片描述在这里插入图片描述


3. Spring Beans

3.1 说说Spring支持的几种bean的作用域

  • singleton:bean在Sring容器中只有一个实例
  • prototype:一个bean可以有多个实例
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
  • session:在一个Http Session中,一个bean定义对应一个实例
  • application:一个Web应用创建一个
  • websocket:一个WebSocket会话创建一个

Bean默认的作用域是Singleton

3.2 Spring框架中单例bean线程安全吗?

线程不安全。单例bean也是系统默认的作用域,bean大部分都是无状态的,如果需要有状态的话,需要开发者自己保证线程安全,也可以将作用域改为prototype。

3.3 bean的生命周期

它分为两个阶段,第一个阶段针对BeanDifinition,第二个阶段针对Bean实例

3.3.1 BeanDifinition阶段

BeanDefinition阶段为加载配置文件(xml配置文件、注解配置类),BeanDefinition的后置处理 在这里插入图片描述

3.3.2 Bean实例生命周期

bean的实例化 属性赋值 + 依赖注入 bean的初始化生命周期回调 bean实例的销毁

bean的实例化方式

  • xml文件中采用<bean>标签,@Bean注解,@Component注册后实例化
  • FactoryBean实例化bean
  • 使用静态工厂方法( factory-method )实例化 bean

使用实例工厂方法( factory-bean + factory-method )实例化 bean

在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.4 理解BeanDefinition

BeanDefinition描述bean的元信息,包括类的信息、属性、行为和依赖关系等,可以被BeanDefinitionRegistryPostProcessor构造和注册,被BeanFactoryPostProcessor进行修改

  • bean中元信息包括:全限定名classname,作用域scope,是否懒加载,工厂bean名称,构造方法参数列表,属性值

3.5 什么是Spring的内部bean?

当一个bean仅仅被当作另一个bean的属性时,它被声明为内部bean。内部bean可以通过setter构造方法注入,它们通常都是匿名的,作用域是prototype

3.6 Spring自动装配bean有哪些方式?

在Spring框架XML配置中共有5种自动装配:

  1. no:默认不自动装配,通过手动设置ref属性来装配bean
  2. byName:通过bean的名称自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配
  3. byType:通过参数的数据类型自动装配
  4. construct:利用构造函数装配,参数是根据byType进行装配
  5. autodetect:自动探测,如果有默认的构造方法,通过construct方式装配,否则byType的方式自动装配

呼呼呼!肝完了!

猜你喜欢

转载自juejin.im/post/7034364831616466975
今日推荐