作者 青鸟
Spring是Java开发中一个非常实用的开发体系。它实现了层与层之间的解耦合。下面详细学习一下Spring的核心思想与技术
Ioc思想及Spring中的实现
Java现状及Ioc思想
先看一个示例:
|
|
|
|
这是现在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技术
参考文章: