spring知识点总结
1.Spring特点
Ø轻量级容器
•完全采用POJOs进行开发,不需要依赖任何应用服务器,以集中的、自动化的方式进行应用程序对象创建和装配,负责对象创建和装配,管理对象生命周期
Ø非侵入性
•无需继承框架提供的类,如果以后想更换框架之前之前写过的代码仍然可以继续使用
Ø面向切面编程
•在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能。
Ø与第三方框架完美集成
•Structs,Hibernate,Mybatis
2.源码梳理
2.1 xml→BeanDefinition
2.2 Bean实例化
3. 问题讨论
3.1 Bean何时实例化
BeanFactory作为Spring Bean的工厂类,所有的bean都是在第一次使用该Bean的时候实例化
ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:
- 如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候,直接从这个缓存中取
- 如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
- 如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
3.2 Bean常用扩展接口
接口
|
方法
|
作用
|
|
Bean层面
|
BeanNameAware
|
setBeanName(String var1)
|
获取BeanName
|
BeanFactoryAware
|
setBeanFactory(BeanFactory var1)
|
获取BeanFactory
|
|
BeanPostProcessor
|
postProcessBeforeInitialization
(Object var1, String var2)
|
在spring容器实例化bean之后,在执行bean的初始化方法前后
|
|
postProcessBeforeInitialization
(Object var1, String var2)
|
|||
IntializingBean
|
afterPropertiesSet()
|
init-method类似,且在其之前执行
|
|
DisposableBean
|
destroy()
|
destroy-method类似,且在其之前执行
|
|
BeanFactory
|
BeanFactoryPostProcessor
|
postProcessBeanFactory(ConfigurableListableBeanFactory var1)
|
在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype
|
3.2 beanID是否可以相同?相同会出现什么问题?
spring对同一配置文件中相同id或者name的两个或以上的bean时,做直接抛异常的处理,而对不同配置文件中相同id或者名称的bean,只会在打印日志级别为info的信息,信息内容大概为"Overriding bean definition for bean xxx : replacing xxx with beanDefinition ".
可能引发的问题:
当不同文件中配置了相同id或者name的同一类型的两个bean时,如果这两个bean的类型虽然相同,但配置时又有差别时,那么最终spring容器只会实例化后面的这个bean,后者将前者覆盖了。这种情况下,要排查问题很困难。
3.3 bean自动装配歧义性问题
找不到bean会发生什么?
自动装配找不到Bean编译期并不会报错,运行期导致NPE,可以通过bean标签中dependency-check强制进行依赖检查
什么类型不可以作为自动装配的对象?
基本类型(int)、Object、Set、Collection、List 、Map接口
对于一个bean,同时存在注解注入和配置文件注入,会发生什么?
配置注入的数据会覆盖自动装配注入的数据