Spring笔记和小结(2) (1)
这一节主要简单介绍了依赖注入的思想。强调了依赖注入是Spring框架的一种核心模式。
下图简单的说明了这种依赖注入的情况。客户端使用到了另一个我们称为service的类。客户端有自己的属性用来接受这个service。这个service被包装成一个接口,因此客户端是看不到service的具体实现的。但是这个并不完全是松耦合的,我们仍然要自己创建service。在依赖注入的思想里,一种第三方的控制器或装配器用来创建一个客户端和一个service,然后set一个service的引用来满足依赖注入的要求。
其实我们并不一定需要一个轻量级容器来使用依赖注入的模式。我们只需要三步就可以使用依赖注入模式来完成模块的解耦:
1 将这个service类包装成一个接口
2 给客户端添加一个属性,做为这个service接口的引用
3 使用一个第三方框架或自己编写的代码来开发这个service并设置该属性。
下面我们来看如何改写第一节里的范例代码:
Example 1-4. ArrayListRentABike.java (renamed from RentABike.java)
import java.util.*;public class ArrayListRentABike implements RentABike { private String storeName; final List bikes = new ArrayList( ); public ArrayListRentABike( ) { initBikes( ); } public ArrayListRentABike(String storeName) { this.storeName = storeName; initBikes( );}public void initBikes( ) { bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair")); bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222", 12, "Excellent")); bikes.add(new Bike("Trek", "6000", 19, "33333", 12.4, "Fair"));}public String toString( ) { return "RentABike: " + storeName; }public List getBikes( ) { return bikes; }public Bike getBike(String serialNo) { Iterator iter = bikes.iterator( ); while(iter.hasNext( )) { Bike bike = (Bike)iter.next( ); if(serialNo.equals(bike.getSerialNo( ))) return bike; } return null; }}
Example 1-5. RentABike.java
import java.util.*;interface RentABike { List getBikes( ); Bike getBike(String serialNo);}
大家看到了,RentABike由原来的具体类改成了一个接口,而具体实现类是由ArrayListRentABike来完成的。实现类里的操作和方法和第一节里的原RentABike是一模一样的。
再来看看客户端的代码:
Example 1-6. CommandLineView.java
import java.util.*;public class CommandLineView { private RentABike rentaBike;//接口的引用 public CommandLineView( ) { } //set接口 public void setRentaBike(RentABike rentaBike) { this.rentaBike = rentaBike; } public RentABike getRentaBike( ) { return this.rentaBike;} public void printAllBikes( ) { System.out.println(rentaBike.toString( )); Iterator iter = rentaBike.getBikes( ).iterator( ); while(iter.hasNext( )) { Bike bike = (Bike)iter.next( ); System.out.println(bike.toString( )); } }}
字串5
下图简单的说明了这种依赖注入的情况。客户端使用到了另一个我们称为service的类。客户端有自己的属性用来接受这个service。这个service被包装成一个接口,因此客户端是看不到service的具体实现的。但是这个并不完全是松耦合的,我们仍然要自己创建service。在依赖注入的思想里,一种第三方的控制器或装配器用来创建一个客户端和一个service,然后set一个service的引用来满足依赖注入的要求。
其实我们并不一定需要一个轻量级容器来使用依赖注入的模式。我们只需要三步就可以使用依赖注入模式来完成模块的解耦:
1 将这个service类包装成一个接口
2 给客户端添加一个属性,做为这个service接口的引用
3 使用一个第三方框架或自己编写的代码来开发这个service并设置该属性。
下面我们来看如何改写第一节里的范例代码:
字串3
Example 1-4. ArrayListRentABike.java (renamed from RentABike.java)
import java.util.*;public class ArrayListRentABike implements RentABike { private String storeName; final List bikes = new ArrayList( ); public ArrayListRentABike( ) { initBikes( ); } public ArrayListRentABike(String storeName) { this.storeName = storeName; initBikes( );}public void initBikes( ) { bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair")); bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222", 12, "Excellent")); bikes.add(new Bike("Trek", "6000", 19, "33333", 12.4, "Fair"));}public String toString( ) { return "RentABike: " + storeName; }public List getBikes( ) { return bikes; }public Bike getBike(String serialNo) { Iterator iter = bikes.iterator( ); while(iter.hasNext( )) { Bike bike = (Bike)iter.next( ); if(serialNo.equals(bike.getSerialNo( ))) return bike; } return null; }}
Example 1-5. RentABike.java
字串7
import java.util.*;interface RentABike { List getBikes( ); Bike getBike(String serialNo);}
大家看到了,RentABike由原来的具体类改成了一个接口,而具体实现类是由ArrayListRentABike来完成的。实现类里的操作和方法和第一节里的原RentABike是一模一样的。
再来看看客户端的代码:
Example 1-6. CommandLineView.java
import java.util.*;public class CommandLineView { private RentABike rentaBike;//接口的引用 public CommandLineView( ) { } //set接口 public void setRentaBike(RentABike rentaBike) { this.rentaBike = rentaBike; } public RentABike getRentaBike( ) { return this.rentaBike;} public void printAllBikes( ) { System.out.println(rentaBike.toString( )); Iterator iter = rentaBike.getBikes( ).iterator( ); while(iter.hasNext( )) { Bike bike = (Bike)iter.next( ); System.out.println(bike.toString( )); } }}
字串5
Tags:
责任编辑:
上一篇:Spring笔记和小结(2) (2) 下一篇:Spring笔记和小结(1)(2)
您的评论
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
精彩推荐
最新资讯


您的位置: