「这是我参与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的抽象层,用于简化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,并装配给该对象的属性
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的方式自动装配
呼呼呼!肝完了!




近期评论