J2EE 应用实践教程第二章 Spring框架笔记1

来源:互联网 发布:数控铣简单图形编程 编辑:程序博客网 时间:2024/05/22 14:58

Spring FrameWork是Java EE应用程序框架,是针对Bean的生命周期进行管理的轻量级容器。该框架的主要优势是分层架构,允许选择使用某个组件。

 

1.Dependency Inversion

Spring的核心概念是IoC(Inversion of Control,控制反转),要了解IoC,先了解Di(Dependency Inversion,依赖反转)

例如:类Business需要调用UsbDiskWriter的save()方法,日常做法如下:

public class UsbDiskWriter {public void save(){}public class Business{UsbDiskWriter writer;public Business(){writer = new UsbDiskWriter();}public void save(){writer.save();}}}

 

UsbDiskWriter:底层类,  Business高层类

由于Business类的方法save()依赖于类UsbDiskWriter,如果某天要更换底层(被调用)类为FloppyWriter,则这个Business类没有办法重用,必须加以修改:

Business——>UsbDiskWriter      变为          Business——>UsbDiskWriter、FloppyWriter。

底层类的改变(添加了FloppyWriter底层类)造成了高层类(Business)也必须改变,这不是一个好的设计方式。在设计上,希望类都依赖于接口,这样才能重用高层类。

 

Di依赖反转解释为高层类不依赖于底层类,而是依赖于接口。如下所示:

创建一个接口IWriter:

public interface IWriter {public void write();}

 

创建一个底层类UsbDiskWriter实现IWriter接口:

public class UsbDiskWriter implements IWriter{@Overridepublic void write() {// TODO Auto-generated method stub//把内容保存到USB盘中}}

 

创建一个可重用的高层类Business类:

public class Business {IWriter writer;//此处也可以用FloppyWriter对象来构造//通过构造来注入依赖关系public Business(UsbDiskWriter writer){this.writer = writer;}public void save(){writer.write();}}

 

此代码中,如果需要将内容存储到FloppyWriter或者别的介质中,只需实现IWriter接口就可以了,而不用修改Business。此即反转依赖:

Business——>IWriter<——UsbDiskWriter、FloppyWriter

IoC其实也是一种依赖关系的转移:如果A依赖于B,则B有控制权。

我们可以控制这种关系的转移以获得高层类的重用性。这个控制权从实际的UsbDiskWriter转移到抽象的IWriter接口上,使得Business对象,FloppyWriter类、UsbDiskWriter类都依赖于接口IWriter。

 

2.Dependency Injection

IoC是一个高层的概念,实现IoC有两种方式,Dependency Injection和Service Locator。Spring采用的是Dependency Injection。

Business依赖于实际的UsbDiskWriter,为了让Business获得重用性,不让Business直接依赖于实际的UsbDiskWriter,而是依赖于抽象的接口。

创建一个接口IWriter:

public interface IWriter {public void write();}

 

创建一个可重用的高层类Business:

public class Business {private IWriter writer;//通过Setter来注入依赖关系public void setWriter(IWriter writer){this.writer = writer;}public void save(){writer.write();}}

 

创建一个底层类UsbDiskWriter实现IWriter接口

public class UsbDiskWriter implements IWriter{@Overridepublic void write() {// TODO Auto-generated method stub//把内容保存到USB盘中}}

 

创建一个底层类FloppyWriter实现IWriter接口

public class FloppyWriter implements IWriter{@Overridepublic void write() {// TODO Auto-generated method stub//把内容保存到Floppy中}}

 

business.setWriter(new UsbDiskWriter());//使Business与UsbDiskWriter发生依赖关系business.setWriter(new FloppyWriter());//使Business与FloppyWriter发生依赖关系

 

dependency Injection依赖注入有三种实现方式:

Interface injection(Type 1 IoC)、Setter injection(Type 2 IoC)与Constructor injection(Type 3 IoC)。

Spring鼓励通过Setter,但也允许通过Constructor injection来注入依赖关系。

使用Constructor:可以在构建类的同时完成依赖关系的构建,但如果要建立的类关系很多,构建类时参数会很长,此时建议使用Setter,而且Setter有明确的名称setXXX()。

Type 1 IoC有很强的侵入性,一般不使用。

 


 

0 0
原创粉丝点击