大家好,我是
方圆
愿你我奋勇向前,永不疲惫
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的抽象层,用于简化JDBCspring aop
:面向切面编程,可以实现拦截器或织入其他功能spring web
:提供针对web开发的集成特性spring test
:为测试提供支持,支持使用JUnit进行单元测试
1.4 Spring框架中的设计模式
工厂模式
:BeanFactory就是工厂模式的实现,用于创建对象实例单例模式
:Bean默认为单例模式代理模式
:AOP功能利用的就是JDK动态代理模式和CgLIb动态代理模式模板方法模式
:解决代码重复的问题观察者模式
:应用在事件的监听器处
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 依赖注入实现方式
Setter方法注入
构造器注入
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种自动装配:
no
:默认不自动装配,通过手动设置ref属性来装配beanbyName
:通过bean的名称自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配byType
:通过参数的数据类型自动装配construct
:利用构造函数装配,参数是根据byType进行装配autodetect
:自动探测,如果有默认的构造方法,通过construct方式装配,否则byType的方式自动装配
呼呼呼!肝完了!