IoC容器

IoC/DI基础

IoC/DI设计思想

IoC是一种设计思想,用来解决类与类之间的耦合问题。IoC意味着你将设计好的对象交给容器,而不是传统的你在对象内部直接创建。这样可以用来降低计算机代码之间的耦合度,这种设计思想最常见实现方式是依赖注入(DI),还有一种方式叫做以来查找(Dependency Lookup)。

对于为什么IoC能够降低代码耦合性,可以查看我的另一篇博客以及以下的图:

  1. 传统应用程序:
    IoC容器
    我们发现是由客户端类这个主类完成的依赖注入,一旦用户信息类发生变化,不但要修改用户类,还要修改客户端类。
  2. 有IoC/DI后的应用程序
    IoC容器
    这里是由IoC容器完成的依赖注入,这样用户类、用户信息类、客户端类就减少耦合了 。一旦用户信息类发生变化,我们的客户端类不受任何影响,依然是向IoC容器取要对象就行。

小小总结:IoC是一种设计思想,DI是实现方式,IoC和DI用来解决类与类之间的耦合问题。

IoC容器及其功能

管理所有Bean对象的容器叫做IoC容器,它可以管理所有轻量级的Bean组件。提供的底层服务包括:

  1. Bean生命周期管理
  2. Bean配置和组装服务
  3. AOP支持
  4. 以及建立在AOP基础上的声明式事务服务等。

IoC容器的实际代表者——BeanFactory和ApplicationContext接口

我们上面说了一大堆概念性的东西,那么Spring中IoC到底长什么样子呢?
Spring提供两种类型的容器,分别为BeanFactoryApplicationContext

  1. BeanFactory是最基础的IoC容器,是个工厂接口,给具体的IoC容器提供了规范。
  2. ApplicationContext继承了BeanFactory,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。

他们之间的继承关系如下图所示:
IoC容器

BeanFactory和ApplicationContext的实现类

BeanFactory的三个实现类

BeanFactory有三个实现顶级类,分别为DefaultListableBeanFactory、StaticListableBeanFactory和SimpleJndiBeanFactory。
我们常用的XmlBeanFactory就继承自DefaultListableBeanFactory

  1. StaticListableBeanFactory
    这是一个基于 LinkedHashMap<String, Object>()的ListableBeanFactory单例实现,不支持原型模式和别名。
  2. SimpleJndiBeanFactory
    查看SimpleJndiBeanFactory源码,是基于JndiLocatorSupport的BeanFactory实现,并使用HashMap进行缓存处理。
  3. XmlBeanFactory/DefaultListableBeanFactory

这里还不是很理解,这里先作为知识结构罗列,日后再来单独开一张详细说明。

ApplicationContext的三个实现类

  1. FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
  2. ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
  3. WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。

BeanFactory和ApplicationContext的基础应用

这里我们首先体验一下BeanFactory和ApplicationContext,更多的使用场景,我们之后再说。

BeanFactory

链接

ApplicationContext

链接

BeanFactory和ApplicationContext的区别

未完待续

Spring中的Bean

我们说了IoC是Bean的容器,那么你是否会有疑惑什么是Bean?

JavaBean与Spring中的Bean

JavaBean

传统的java应用中,JavaBean遵循一些规范,规范如下:

  1. 这个类必须具有一个公共的(public)无参构造函数;
  2. 所有属性私有化(private);
  3. 私有化的属性必须通过public类型的方法(getter和setter)暴露给其他程序,并且方法的命名也必须遵循一定的命名规范。
  4. 这个类应是可序列化的。(比如可以实现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 容器所管理的对象。

Bean的生命周期

参考文献

第一部分IoC

  1. spring的两种容器类型
  2. BeanFactory接口分析详解
  3. 手动实现BeanFactory
  4. BeanFactory体系之抽象类、类分析(一)
  5. BeanFactory学习总结
  6. Spring 基础容器 BeanFactory
  7. Spring学习系列(三)——BeanFactory的三类实现DefaultListableBeanFactory,StaticListableBeanFactory,SimpleJndiBeanFactory.
  8. 五种方式获取ApplicationContext
  9. Spring实现IoC的多种方式

第二部分Bean

  1. Spring Bean和Java Bean的区别
  2. Bean的定义
匿名

发表评论

匿名网友