目录
一、Spring Bean
1.1 面:谈谈Spring Bean的5个作用域?
作用域:用于确定Spring创建Bean的实例个数。
Spring bean支持5种scope,默认是Singleton
。
Singleton
:每一个Spring IoC容器中仅存在一个单实例bean,适合无状态的bean
Prototype
:每次从容器中请求调用bean时,都会返回一个新的实例,适合有状态的bean【要三思,因为毕竟频繁的创建和销毁bean是有开销的】
- 此外如果是Web容器,则还支持:
Request
:每次Http请求都会创建一个新的beanSession
:会为每个session创建一个bean实例,同一个HttpSession共享同一个bean,不同的HttpSession使用不同的beanGlobalSession
:会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效,同一个全局Session共享一个bean【全局Session,在SSO中,一次登陆,处处登陆】
1.2 面:Spring bean的生命周期
- Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
- Bean实例化后对将Bean的引入和值注入到Bean的属性中
- 对于普通类型的属性,例如 String,Integer等,比较容易处理,直接设置即可。但是如果某个 bean 对象依赖另一个 bean 对象,此时就不能直接设置了。Spring 容器首先要先去实例化 bean 依赖的对象,实例化好后才能设置到当前 bean 中。
- 检查 bean 对象是否实现了 xxxxAware 一类的接口,如果实现了则把相应的依赖设置到 bean 对象中。
-
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法:在创建此bean的bean工厂中设置bean的名称,在普通属性设置之后调用
-
如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入:回调提供了自己的bean实例工厂,在普通属性设置之后
-
如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。:
-
-
如果存在有Bean实现了BeanPostProcessor接口,Spring就将调用他们的前置处理方法,即 postProcessBeforeInitialization(Object bean, String beanName);【通过实现BeanPostProcessor接口,我们就可以插手Bean的实例化过程】
-
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,检查配置文件中是否配置了 init-method 属性,如果配置了,则去调用 init-method 属性配置的方法(即调用自定义初始化方法)。[以及@PostConstruct注解,它会在构造函数之后,init方法之前执行,(自己的理解,@PostConstruct = afterPropertiesSet = init-method,都是初始化方法,不过@PostConstruct会先调用)]【比如我通过实现IntializingBean,在资讯分享网站中在spring一起来的时候就创建了一个消费者】
-
被BeanFactory在设置所有bean属性之后调用(并且满足BeanFactory 和 ApplicationContextAware)。
-
-
如果存在有Bean 实现了BeanPostProcessor接口,Spring就将调用其后置处理方法,即 postProcessAfterInitialization(Object bean, String beanName)。我们所熟知的 AOP 就是在这里将 Adivce 逻辑织入到 bean 中的;
-
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
-
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。【(自己的理解,@PreDestroy = destroy = destroy-method,不过@preDestroy会先调用)】
1.3 使用Spring框架的好处是什么?
轻量:Spring是轻量的,基本的版本大约2MB
控制反转:Spring通过控制反转实现松耦合,对象由IOC容器注入,而不是自己去创建或查找依赖的对象
面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开
容器:Spring包含并管理应用中对象的生命周期和配置
MVC框架:Spring的web框架是一个精心设计的框架,是Web框架的一个很好的替代品
事务管理:Spring提供一个持续的事务管理接口,可以扩展到到上至本地事务下至全局事务(JTA)
异常处理:Spring提供方便的API把具体技术相关的异常(比如由 JDBC,Hibernate or JDO 抛出的)转化为一致的 unchecked 异常。
1.4 有哪些不同类型的 IOC(依赖注入)方式?
- 1、构造器依赖注入: 构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- 2、Setter方法注入: Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。
最好的解决方案是用构造器参数实现强制依赖,setter 方法实现可选依赖。