读书人

黄晓童SPRING学习札记:对DI的深入探究

发布时间: 2012-09-06 10:37:01 作者: rapoo

黄晓童SPRING学习笔记:对DI的深入探究

Spring的定义
对DI的初步理解
对AOP的初步理解
对DI的深入探究
对AOP的深入探究
Spring的事务管理
Spring MVC

?spring的特性之一是DI,而DI的关键在于bean的装配,即创建系统各组件之间的协作关系。而组件是存活在spring容器中的,容器是spring的核心,spring提供多种容器的实现。第一种是bean工厂,即BeanFactory接口;第二种是ApplicationContext接口。BeanFactory是最简单的容器,只提供了基础的依赖注入支持;而后者是在BeanFactory基础之上的,提供了更多的系统服务。
?Spring中有多种Beanfactory的实现,其中最常见的一种就是根据XML配置文件来装载bean的XmlBeanFactory。但是要创建一个XmlBeanFactory实例需要传递一个Resource类型的实例给构造函数,正是此Resource对象提供了XML文件给BeanFactory。因此,创建一个Beanfactory可以这样做:

?

传统的注入该bean方式如下:

?

当然,我们需要定义一个乐器接口Instrument:

?

?其实我们会发现,使用setter注入和使用构造函数注入,没什么区别,代码几乎相同。如果,kenny很聪明并且还会演奏钢琴的话,我们只需要声明一个钢琴类,再修改一下配置文件,ref=” piano” 即可。几乎不需要修改任何已有代码,这样就实现了松耦合的目的。
?现在,kenny可以演奏任何实现Instrument接口的乐器了,然而,这些乐器也可以被其他人所演奏,因此,就产生了乐器的个人卫生问题(萨卡斯风是要使用嘴吹的)。我们可以通过注入内部bean来解决这个问题:

?
我们可以将上面的配置改成如下这样,以实现spring的自动注入:

?

?然而,我们也可以使用混合的方式,如:在设置autowire=”byType”时,显式的装配某个bean,而不需要spring自己去寻找一个type相同的bean,以避免有多个相同类型的bean时spring抛出异常。
?由此我们可以发现,spring的自动装配存在很多问题,其中最大的缺点就是缺乏代码的可读性和透明性。
?我们已经了解了spring对bean的装载的基础知识。下面我们来说一下spring中bean的范围。在spring中,bean的范围可以是如下几种:singleton、prototype、request、session、global-session,比如:

?
?可是,这个比赛不止kenny一个人会吹萨克斯,现在又有一个david也吹萨克斯,而且也演奏“Jingle bells”。这样的话,如果配置两条除id以外都相同的bean多少有些累赘。这时我们就需要使用到bean的继承特性。配置如下:

<bean  id=”frank” parent=”baseSaxophonist” > <property  name=”song”  value=”another song” /></bean>

?

?然而,声明父bean时我们也可以不指定bean的class属性,具体的class由子bean去指定,这样,我们就可以将一些常用到的属性提出到父bean,让各个bean去继承,而各子bean不必是相同的类型。

读书人网 >软件架构设计

热点推荐