概述
Spring IOC控制反转,分为两个方面解释:
- 控制:对象对于内部成员的控制
- 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦
IOC的好处是:
- 无需手动创建,拿来就用
- 享受单例的好处,效率高、节省空间
- 统一配置,方便管理
原理
spring ioc容器原理是根据Java的反射机制,获取类的所有信息,再通过xml或者注解配置获取类与类之间的关系,最后根据以上信息构建类与类之间的依赖。
容器加载bean原理如下:
- 根据xml、注解获取bean的配置信息,在容器内部创建注册表
- 根据注册表实例化bean,并创建bean与bean之间的依赖
- 将初始化的bean保存在容器的缓存中(hashmap),等待客户端调用(bean的作用域为singleton,如果为property则不缓存直接返回)
Spring容器
bean工厂分为两种:
- BeanFactory,面向Spring
- ApplicationContext,基于BeanFactory基础,实现了一系列功能
两者区别?
- BeanFactory初始化bean采用懒加载,在获取的时候才创建;ApplicationContext启动时一次性全部加载,如果配置错误则无法启动容器,可以提前检测配置正确性,当然也导致容器启动速度慢
- 对于配置文件,ApplicationContext提供了访问URL和文件访问的接口
- ApplicationContext支持aop
- BeanFactory接口需手动注册,ApplicationContext自动
容器启动原理
web环境Spring、Spring mvc容器加载过程
对于一个web应用,部署在web容器中,容易提供一个全局应用上下文(ServletContext),为后面的IOC容器提供宿主环境。
其次,因为web.xml中会提供有contextLoaderListener(或ContextLoaderServlet),当web容器启动后,触发IOC容器初始化时间,contextLoaderListener监听到事件后,Spring将初始化一个上下文(WebApplicationContext接口),实现类为XmlWebApplicationContext(IOC容器)。 IOC初始化后,开始初始化各种servlet(DispatchServlet),以IOC容器为宿主环境进行初始化(两者都有属于自己的bean缓存)
bean生命周期
Spring IOC模式与工厂模式的区别?
当需求改变,工厂模式需要手动修改;IOC是动态生成的