作者 青鸟

Spring是Java开发中一个非常实用的开发体系。它实现了层与层之间的解耦合。下面详细学习一下Spring的核心思想与技术

Ioc思想及Spring中的实现

Java现状及Ioc思想

先看一个示例:

1
2
3
4
5
public class BookDaoImpl implements BookDao{
    public void save (){
        System.out.printyln("service is running");
    }
}
1
2
3
4
5
6
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save (){
        BookDao.save();
    }
}

这是现在Java开发业务层和数据层的基本实现。

但是我们发现了一个问题,假如我们重写了BookDaoImpl中的save()方法,那么我们也需要重写业务层中的相应的逻辑。这便导致了程序中的耦合度太高。可以看出来,问题主要出在了 private BookDao bookDao = new BookDaoImpl();这一句上,也就是提供bookDao的具体实现导致了耦合度变高。但是假如我们去掉这一句话,那么程序就会缺少具体的实现。

解决方案:关键在于缺少了一个bookDao的对象。那么使用对象时,在程序中不要主动使用new来产生对象,转换为由外部来提供,这种思想也称作Ioc思想(Inversion of Control)也就是控制反转

Ioc就是由主动new产生对象转换为外部提供对象。对象的控制权由程序转移到外部,这种思想也称作控制反转

Spring实现Ioc思想

Spring技术对Ioc思想进行了实现。Spring提供了一个容器,称为Ioc容器,这个容器用来充当Ioc思想中的外部

Ioc容器负责对象的创建、初始化等一系列工作,被创建或者管理的对象在Ioc容器中也被称为Bean

但是我们发现,service层还是需要Dao对象。但是在Ioc容器中,我们同时有了service和Dao两个对象。因此,我们可以直接在Ioc容器中完成这种绑定。

在容器中建立bean和bean之间的依赖关系的整个过程,我们称为Di(Dpendency Injection)也就是依赖注入

这一切的最终目的是为了充分解耦。1. 使用Ioc容器管理bean,在Ioc容器中将有依赖关系的bean进行绑定。。

最终效果:使用对象时可以直接从Ioc对象中获取,并且获取到的Bean已经绑定了所有的依赖关系。

Spring容器的实现

BeanFactory 是最顶层的一个接口类,定义了IOC 容器最基本功能规范。

BeanFactory 有个重要的子类

ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory

从类图中可以看到最终的默认实现类是DefaultListableBeanFactory,实现了所有的接口

定义这么多层接口的目的:每个接口都有它使用的场合,主要是为了区分在Spring 内部操作对象的传递和转化过程,对对象数据访问所做的限制

ListableBeanFactory 这些Bean 是可列表化

HierarchicalBeanFactory 表示Bean是有继承关系的

AutowireCapableBeanFactory bean的自动装配

三个接口总结:Bean的集合、Bean之间的关系、Bean行为

BeanFactory 只定义了IOC 容器的基本行为,不关心bean 是如何定义加载的。 IOC 容器具体的实现需要了解GenericApplicationContext、ClassPathXmlApplicationContext等

ApplicationContext是BeanFactory的派生容器。

ApplicationContext也是我们在目前的框架下实现Spring中的Ioc容器的主要接口

Application在BeanFactory原有功能的基础上还有面向实际的 高级功能 国际化接口 ,MessageSource,ResourceLoader(可以去加载外面资源的接口),ApplicationEvent的publish这样一些 应用事件发布接口。

最大的区别是 ApplicationContext在启动时就把所有的对象都创建对象。

Spring技术

参考文章:

Spring核心–容器详解

Spring容器详细介绍