Spring技术

(一)Spring技术介绍

1) Spring的优点

  • Spring定位的领域是众多流行的框架所没有的,他能提供一种方法来管理业务对象。
  • Spring是全面的和模块化的,他有严格的分层体系
  • 是用于测试驱动工程的理想的框架。
  • Spring涉及到在其他的框架中没有考虑到的内容。

2) Spring将改变JavaEE

  • 低侵入式设计,代码污染极低
  • 独立于各种应用服务器
  • SpringDI机制降低了业务对象替换的复杂性
  • Spring并不完全依赖于其自身,开发者可自由选用spring的部分或全部。

(二)下载并安装Spring

1) 获取Spring的压缩包

v Spring-framework-3.1.0.RELEASE-with-docs.zip

v Spring-framework-3.1.0.RELEASE.zip

2) 压缩文件下的目录结构

  • Dist:该文件夹下包含了SpringJAR
  • Docs:存放了Spring的相关文档
  • Projects:存放了Spring分模块化的项目

(三)依赖注入

前言:

Spring能有效的组织JavaEE应用各层的对象。无论是控制层的Action对象,还是业务层的Service对象,还是持久层的Dao对象,都可在Spring的管理下有机的调用并行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无需关心Service的具体实现,Service对象无须关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要进行重构的时候,代码的改写量将大大减少。

1) 依赖注入基础

v 依赖注入DI和控制反转Ioc是同一个概念,具体含义是,当某一个角色需要另外一位角色的协助的时候,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。

v 但是在Spring中创建被调用者的工作不再由调用者来完成,通过Spring容器来完成,这就是控制反转Ioc

v 创建被调用者的实例的工作由Spring容器来完成,然后注入调用者,因此也称依赖注入。

2) 设置注入

 

 

 

 

 

 

v 设置注入也称为Set注入(Setter Injection),是指在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素。

public interface Person{

//定义一个使用斧子的方法

public void useAxe();

}

public interface Axe{

//Axe接口有一个坎的动作

public void chop();

}

public class Zhang implements Person{

private Axe axe ;

public void setAxe(Axe axe){this.axe = axe;}

public void useAxe(){

System.out.println(axe.chop());

}

}

public class StoneAxe implements Axe{

 

public String chop(){return "斧坎好慢!";}

}

 

<bean id="chinese" class="org.mmm.app.service.impl.Zhang">

<property name="axe" ref="stoneAxe">

</bean>

<bean id="stoneAxe" class="org.mmm.app.service.impl.StoneAxe">

 

</bean>

 

案例总结:

通过上面的案例,我们可以看到,使用SpringIoc and DI可以做到真正的面向接口编程。

在使用Ioc需要注意的三个基本要点:

ü 应用程序的各个组件面向接口编程,面向接口编程可以使得各个组件这间的耦合度提升到接口层次,从而有利于项目后期的扩展。

ü 应用程序的各组件不再由程序主动生成,而由Spring容器负责产生,并初始化。

ü Spring采用配置文件,Annotation来管理Bean的实现类,依赖关系,Spring则根据配置文件,利用反射来创建实例,并为之注入依赖关系。

 

 

 

 

 

 

3) 构造注入

构造注入是指通过构造函数来完成依赖关系的设定,而不是通过setter方法 。

public class Zhang implements Person

{

private Axe axe;

public Zhang(){}

public Zhang(Axe axe){this.axe = axe;}

public void useAxe(){

System.out.println(axe.chop());

}

}

 

<bean id="chinese" class="org.mmm.app.service.impl.Zhang">

<constructor-arg ref="steelAxe">

</bean>

<bean id="stoneAxe" class="org.mmm.app.service.impl.StoneAxe"></bean>

<bean id="steelAxe" class="org.mmm.app.service.impl.SteelAxe"></bean>

 

构造注入则在创建Bean实例时,已经完成了依赖关系的设置。

 

(四)Spring容器

1) 相关类的介绍

Spring容器的最为基本的额接口是BeanFactory,功能是配置,创建,管理Bean。它有一个子接口,ApplicationContext,因此称为Spring的上下文。

重点放在ApplicationContext

ApplicationContext有两个实现类

  • FileSystemXmlApplicationContext

ApplicationContext appContext = new FileSystemXmlApplicationContext(

new String[]{“bean.xml”,”service.xml”}

);

  • ClassPathXmlApplicationContext

ApplicationContext appContext = new ClassPathXmlApplicationContext(

new String[]{“bean.xml”,”service.xml”}

 

);

 

2) Spring Ioc容器

问题:

① 什么是Ioc容器?

我们经常接触的BeanFactoryApplicationContext都可以看成是容器的具体表现形式。

② 它在Spring中到底长什么样?

如果深入到Spring的实现去看,会发现Ioc容器实际上代表着一系列功能各异的容器产品。只是容器的功能有大有小,有各自的特点。

③ 他需要满足的基本特性是什么?

他需要满足BeanFactory这个接口的基本定义

3) BeanFactoryIoc容器的功能定义

Ioc容器的基本接口是由BeanFactory来定义的,也就是说BeanFactory定义了Ioc容器的最基本的形式。

BeanFactory是怎样定义Ioc容器的基本接口

4) XmlBeanFactory的工作原理

ClassPathResource res = new ClassPathResource(“beans.xml”);

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

XmlBeanDefinitationReader reader = new XmlBeanDefinitationReader(factory);

reader.loadBeanDefinitions(res);

在使用Ioc容器的时候,要遵循如下4个步骤

1,创建Ioc配置文件的抽象资源,这个抽象资源包括BeanFinition的定义信息

2,创建一个BeanFactory,这里使用DefaultListableBeanFactory

3,创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFactory

4,从定义好的资源位置读入配置信息,具体的解析过程是由XmlBeanDefinitionReader来完成,完成整个载入和注册bean定以后,需要的Ioc容器就建立起来了,这时候就可以使用Ioc容器了。

posted on 2014-10-19 16:54  六水先生  阅读(152)  评论(0编辑  收藏  举报