一、相关概念
IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。反转是指获得依赖对象的方式反转了,由spring来负责控制对象的生命周期和对象间的关系。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。它并不是一种技术实现,而是一种设计思想。应用程序依赖容器提供的外部对象,容器将其依赖的外部资源在运行期注入到应用程序中;某个对象被调用时,其所依赖的对象由容器注入。
DI实现:
Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
在Spring构造bean的前提是解析该Bean的Definition,解析完成之后生成该bean的<key, BeanDefinition>的map,getBean的时候会根据key对应的BeanDefinition构造相关的Bean对象。
springIOC和工厂模式相比,其优点在热插拔。
热插拔就是说你把XML改了spring就立刻发觉你改动了XML,重新读一遍XML,就会用你的新改动了,根本不用重新启动JVM。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
Spring采用ThreadLocal方案来保证单例模式下的线程安全。
无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。
有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。
有状态就是有数据存储功能,无状态就是一次操作,不能保存数据。
二、优点及缺点
优点
1.资源集中管理,实现资源的可配置和易管理,降低对象关系维护的复杂度。
2.降低了使用资源双方的依赖程度,也就是我们说的耦合度。
缺点
IoC的灵活性是有代价的:设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此使用IoC要看有没有必要,我认为比较通用的判断方式是:用到工厂模式的地方都可以考虑用IoC模式。与工厂模式的区别是:灵活。
三、Spring的bean工厂主要实现了步骤:
1.解析配置文件(bean.xml)
2.使用反射机制动态加载每个class节点中配置的类
3.为每个class节点中配置的类实例化一个对象
4.使用反射机制调用各个对象的seter方法,将配置文件中的属性值设置进对应的对象
5.将这些对象放在一个存储空间(beanMap)中
6.使用getBean方法从存储空间(beanMap)中取出指定的JavaBean
注:借鉴包含但不限于以下博客