IoC/DI基础
IoC/DI设计思想
IoC是一种设计思想,用来解决类与类之间的耦合问题。IoC意味着你将设计好的对象交给容器,而不是传统的你在对象内部直接创建。这样可以用来降低计算机代码之间的耦合度,这种设计思想最常见实现方式是依赖注入(DI),还有一种方式叫做以来查找(Dependency Lookup)。
对于为什么IoC能够降低代码耦合性,可以查看我的另一篇博客以及以下的图:
- 传统应用程序:
我们发现是由客户端类这个主类完成的依赖注入,一旦用户信息类发生变化,不但要修改用户类,还要修改客户端类。 - 有IoC/DI后的应用程序
这里是由IoC容器完成的依赖注入,这样用户类、用户信息类、客户端类就减少耦合了 。一旦用户信息类发生变化,我们的客户端类不受任何影响,依然是向IoC容器取要对象就行。
小小总结:IoC是一种设计思想,DI是实现方式,IoC和DI用来解决类与类之间的耦合问题。
IoC容器及其功能
管理所有Bean对象的容器叫做IoC容器,它可以管理所有轻量级的Bean组件。提供的底层服务包括:
- Bean生命周期管理
- Bean配置和组装服务
- AOP支持
- 以及建立在AOP基础上的声明式事务服务等。
IoC容器的实际代表者——BeanFactory和ApplicationContext接口
我们上面说了一大堆概念性的东西,那么Spring中IoC到底长什么样子呢?
Spring提供两种类型的容器,分别为BeanFactory和ApplicationContext。
- BeanFactory是最基础的IoC容器,是个工厂接口,给具体的IoC容器提供了规范。
- ApplicationContext继承了BeanFactory,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。
他们之间的继承关系如下图所示:
BeanFactory和ApplicationContext的实现类
BeanFactory的三个实现类
BeanFactory有三个实现顶级类,分别为DefaultListableBeanFactory、StaticListableBeanFactory和SimpleJndiBeanFactory。
我们常用的XmlBeanFactory就继承自DefaultListableBeanFactory
- StaticListableBeanFactory
这是一个基于 LinkedHashMap<String, Object>()的ListableBeanFactory单例实现,不支持原型模式和别名。 - SimpleJndiBeanFactory
查看SimpleJndiBeanFactory源码,是基于JndiLocatorSupport的BeanFactory实现,并使用HashMap进行缓存处理。 - XmlBeanFactory/DefaultListableBeanFactory
这里还不是很理解,这里先作为知识结构罗列,日后再来单独开一张详细说明。
ApplicationContext的三个实现类
- FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
- ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
- WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
BeanFactory和ApplicationContext的基础应用
这里我们首先体验一下BeanFactory和ApplicationContext,更多的使用场景,我们之后再说。
BeanFactory
ApplicationContext
BeanFactory和ApplicationContext的区别
未完待续
Spring中的Bean
我们说了IoC是Bean的容器,那么你是否会有疑惑什么是Bean?
JavaBean与Spring中的Bean
JavaBean
传统的java应用中,JavaBean遵循一些规范,规范如下:
- 这个类必须具有一个公共的(public)无参构造函数;
- 所有属性私有化(private);
- 私有化的属性必须通过public类型的方法(getter和setter)暴露给其他程序,并且方法的命名也必须遵循一定的命名规范。
- 这个类应是可序列化的。(比如可以实现Serializable 接口,用于实现bean的持久性)
所以传统的Java应用中JavaBean长得更像这个样子:
public class Info extends Serializable{
private String message;
public void setMessage(String message){
this.message = message;
}
public String getMessage(){
return this.message;
}
}
Spring中的Bean
定义:bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。所有可以被spring容器实例化并管理的java类都可以称为bean。并不一定要符合上述的JavaBean规范
Bean的生命周期
参考文献
第一部分IoC
- spring的两种容器类型
- BeanFactory接口分析详解
- 手动实现BeanFactory
- BeanFactory体系之抽象类、类分析(一)
- BeanFactory学习总结
- Spring 基础容器 BeanFactory
- Spring学习系列(三)——BeanFactory的三类实现DefaultListableBeanFactory,StaticListableBeanFactory,SimpleJndiBeanFactory.
- 五种方式获取ApplicationContext
- Spring实现IoC的多种方式