-
IoC
控制反转,它是一个技术思想不是一个技术实现。
控制:指的是对象创建(实例化,管理)的权利
反转:控制权交给外部环境了(Spring框架,IoC容器)
-
DI
依赖注入
IoC和DI描述的是同一件事。IoC是站在对象的角度,对象的实例化鸡其管理的权力交给了容器。DI是站在容器的角度,容器会把对象依赖的其他对象注入送进去;比如A对象实例化过程中因为声明了一个B类型的属性,那么就需要容器把B对象注入给A。
-
AOP
切面编程
-
创建bean的三种方式
- 使用无参构造函数创建
- 使用静态方法创建
- 使用实例化方法创建
-
Bean的生命周期
单例模式:singleton
对象出生:当创建容器时,对象就被创建
对象活着:只要容器在,对象一直活着
对象死亡:当销毁容器时,对象就被销毁了
一句话总结:单例模式的bean对象生命周期与容器相同
设置lazy-init懒加载,当使用对象时才会创建新的对象实例
(1)开启延迟加载一定程度提高了容器的启动和运转性能
(2)对于不常使用的Bean设置延迟加载,这样偶尔使用的时候在加载,不必要从一开始该bean就占 用资源。
多例模式:prototype
对象出生:当使用对象时,创建新的对象实例
对象活着:只要对象在使用时,就一直活着
对象死亡:当对象长时间不用时,被java的垃圾回收器回收了
一句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁
设置了lazy-init容器启动时不会实例化bean,还是在调用getBean方法时实例化
-
FactoryBean和BeanFactory
BeanFactory接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工厂。
FactoryBean可以生成某一个类型的Bean实例,也就是说可以借助于它自定义Bean的创建过程。
-
后置处理器
spring提供了两种后处理bean的拓展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor。
-
Bean的创建生命周期
-
对象类--->无参构造方法(实例化)--->对象--->依赖注入--->初始化前(@PostConstruct)--->初始化(InitializingBean)--->初始化后(aop)--->代理对象--->bean
-
PostConstruct修饰的方法只能是void,并且无参 InitializingBean:afterPropertiesSet()方法
-
实例化BeanFactoryPostProcessor实现类
执行BeanFactoryPostProcessor的postProcessBeanFactory方法
实例化BeanPostProcessor实现类
实例化InstantiationAwareBeanPostProcessorAdapter实现类
执行InstantiationAwareBeanPostProcessorAdapter的postProcessBeforeInstantiation方法
(中间还有什么国际化,广播器等等操作)
(上面已经实例化,下面进行初始化)
执行Bean的构造器
执行InstantiationAwareBeanPostProcessorAdapter的postProcessPropertyValues方法
为Bean注入属性
调用BeanNameAware的setBeanName方法
调用BeanFactoryAware的setBeanFactory方法
(调用等等Aware方法)
执行BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用Bean的init-method属性指定的初始化方法
执行BeanPostProcessor的postProcessAfterInitialization方法
执行InstantiationAwareBeanPostProcessorAdapter的postProcessAfterInstantiation方法
容器初始化成功,执行正常调用后,下面销毁容器
调用DisposableBean的destory方法
调用Bean的destroy-method属性指定的初始化方法
-
-
单例Bean是否线程安全
- 无状态:bean中没有定义可变的成员变量,此时是线程安全
- 有状态:bean中定义了成员变量,此时是线程不安全(可以将变量保存在ThreadLocal中)
-
Bean创建过程
- 通过反射生成的
-
createBeanFactory
getBean
doGetBean
createBean
doCreateBean
createBeanInstance
populateBean(填充bean)
-
三级缓存中分别保存的是什么对象
- 成品对象
- 半成品对象
- lambda表达式
-
如果只使用一级缓存行不行?
- 不行,因为成品和半成品对象会放到一起,在进行对象获取的时候有可能会获取到半成品对象。这样的对象是无法使用的。
-
如果只有二级缓存行不行?
- getSigngleton
- doCreateBean
- 只有二级缓存的时候也可以解决循环依赖的问题
- 添加aop的实现之后报错
-
三级缓存到底做了什么事
-
如果一个对象需要被代理,生成代理对象,那么这个对象需要预先生成非代理对象吗?
- 需要
-
三级缓存到底做了什么?
- lambda表达式,getEarlyBeanReference(),当前方法中,有可能会用代理对象替换非代理对象,如果没用三级缓存的话,那么久无法得到代理对象,换句话说,在整个容器中,包含了同名对象的代理和非代理对象。
- 容器中,对象都是单例的。
-