目录
题目五:Spring 支持 bean 的作用域有几种吗? 每种作用域是什么样的?(必会)
题目六:BeanFactory 和 ApplicationContext 有什么区别(了解)
题目七:介绍一下Spring bean 的生命周期、注入方式和作用域
题目九:简述Spring中IOC容器常用的接口和具体的实现类
题目一:IOC 原理
题目二:IOC 的使用场景?
题目三:IOC 中 Bean 有几种注入方式?
题目四:Spring 的生命周期?(高薪常问)
题目五:Spring 支持 bean 的作用域有几种吗? 每种作用域是什么样的?(必会)
题目六:BeanFactory 和 ApplicationContext 有什么区别(了解)
题目七:介绍一下Spring bean 的生命周期、注入方式和作用域
(1)默认情况下,IOC容器中bean的生命周期分为五个阶段:
- 调用构造器 或者是通过工厂的方式创建Bean对象
- 给bean对象的属性注入值
- 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
- IOC容器关闭时, 销毁Bean对象.
(2)当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
- 调用构造器 或者是通过工厂的方式创建Bean对象
- 给bean对象的属性注入值
- 执行Bean后置处理器中的 postProcessBeforeInitialization
- 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
- 执行Bean的后置处理器中 postProcessAfterInitialization使用
- IOC容器关闭时, 销毁Bean对象
注入方式:
通过 setter 方法注入
通过构造方法注入
Bean的作用域
总共有四种作用域:
- Singleton 单例的
- Prototype 原型的
- Request
- Session
题目八:请写出 spring 中常用的依赖注入方式。
通过 setter 方法注入
通过构造方法注入
题目九:简述Spring中IOC容器常用的接口和具体的实现类
- BeanFactory SpringIOC容器的基本设置,是最底层的实现, 面向框架本身的.
- ApplicationContext BeanFactory的子接口, 提供了更多高级的特定. 面向开发者的.
- ConfigurableApplicationContext, ApplicationContext的子接口,扩展出了 close 和 refresh等 关闭 刷新容器的方法
- ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
- FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
- XmlWebApplicationContext:由Web应用的XML文件读取上下文。
题目十:请解释Spring Bean的生命周期?
(1)默认情况下,IOC容器中bean的生命周期分为五个阶段:
- 调用构造器 或者是通过工厂的方式创建Bean对象
- 给bean对象的属性注入值
- 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
- 使用
- IOC容器关闭时, 销毁Bean对象.
(2)当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
- 调用构造器 或者是通过工厂的方式创建Bean对象
- 给bean对象的属性注入值
- 执行Bean后置处理器中的 postProcessBeforeInitialization
- 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
- 执行Bean的后置处理器中 postProcessAfterInitialization
- 使用
- IOC容器关闭时, 销毁Bean对象
题目十一:简述Spring 中bean的作用域
总共有四种作用域:
- Singleton 单例的
- Prototype 原型的
- Request
- Session
题目十二:IOC容器的初始化过程
IOC容器的初始化主要包括Resource定位,载入和注册三个步骤,接下来我们依次介绍。
Resource资源定位:
Resouce定位是指BeanDefinition的资源定位,也就是IOC容器找数据的过程。Spring中使用外部资源来描述一个Bean对象,IOC容器第一步就是需要定位Resource外部资源。由ResourceLoader通过统一的Resource接口来完成定位。
BeanDefinition的载入:
载入过程就是把定义好的Bean表示成IOC容器内部的数据结构,即BeanDefinition。在配置文件中每一个Bean都对应着一个BeanDefinition对象。
通过BeanDefinitionReader读取,解析Resource定位的资源,将用户定义好的Bean表示成IOC容器的内部数据结构BeanDefinition。
在IOC容器内部维护着一个BeanDefinitionMap的数据结构,通过BeanDefinitionMap,IOC容器可以对Bean进行更好的管理。
BeanDefinition的注册:
注册是将前面的BeanDefition保存到Map中的过程,通过BeanDefinitionRegistry接口来实现注册。
题目十三:Spring 提供了多种依赖注入的方式
Set 注入
构造器注入
接口注入
注解注入
Spring启动时读取应用程序提供的Bean 配置信息,并在Spring 容器中生成一份相应的Bean 配置注册表,然后根据这张注册表实例化Bean,装配好Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。其中Bean 缓存池为HashMap 实现
题目十四:Spring中,如何给对象的属性赋值?
1. 通过构造函数
2. 通过set方法给属性注入值
3. 自动装配
byName 通过参数名自动装配,如果一个bean的name 和另外一个bean的 property 相同就自动装配。
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另 外一个bean的property属性的数据类型兼容,就自动装配必须确保 该类型在IOC容器中只有一个对象;否则报错。
题目十五:bean对象创建的细节(动力节点)
1) 对象创建: 单例/多例
scope="singleton", 默认值, 即 默认是单例 【service/dao/工具类】
scope="prototype", 多例; 【Action对象】
Spring的单例bean不是线程安全的(可以用局部变量使线程安全)
2) 什么时候创建?
scope="prototype" 在用到对象的时候,才创建对象。
scope="singleton" 在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
3)是否延迟创建
lazy-init="false" 默认为false, 不延迟创建,即在启动时候就创建对象
lazy-init="true" 延迟初始化, 在用到对象的时候才创建对象(只对单例有效)
4) 创建对象之后,初始化/销毁
init-method="init_user" 【对应对象的init_user方法,对象创建之后执行】 destroy-method="destroy_user" 【在调用容器对象的destriy方法时候执行,(容器用实现类)】
题目十六:Bean的生命周期(动力节点)
Bean 容器找到配置文件中 Spring Bean 的定义。
Bean 容器利用 Java Reflection API 创建一个Bean的实例。
如果涉及到一些属性值利用 set()方法设置一些属性值。
如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。
如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。
题目十七:Bean的作用域(动力节点)
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5 已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于 portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都 有不同的会话