问题: 确切的说spring框架是做什么?
描述:我听到了许多关于spring,大家都说在web的世界里做开发spring是非常好的一个框架。但是确切的说它是做什么的?我在开发中如何使用它,有没有示例?
回答:
使用spring可以使你的代码耦合度很低,它最基本的概念是依赖注入。
我将尽我所能给你一个最简单的示例。
问题: 你需要实现一个用户系统并且已经声明了一个接口:UserLister
public interface UserLister{
List getUsers();
}
实现上面的接口,你需要访问数据库获取到所有用户。
public class UserListerDB implements UserLister{
public LisT getUsers(){
//DB access code here
}
}
在你的视图里,你需获得一个实例(记住,下面的仅仅是例子):
public class SomeView{
private UserLister userLister;
public void render(){
List users=userLister.getUsers();
view.render(users);
}
}
注意到没有上面的代码并没有初始化变量 userLister,那么我们应该怎么做呢?如果我明确的指定实例对象:
UserLister userLister =new UserListerDB();
如果这样做了,类的实现和视图的耦合度是比较高的。如果我想切换数据库的实现,例如从多个分离的文件获取所有的用户(请记住,这仅仅是个示例)在这种情况下我将再一次修改我的代码(如果他被应用到很多地方,那么悲剧了):
UserLister userLister =new UserListerCommaSeparatedFile();
如果这个是一个小项目改动的地方还能接受,如果是个很大的项目并且上面的代码被应用到了很多地方,那么它的维护将是一场噩梦。
spring要做的(依赖注入)
spring所要做的是使用xml连接类,这种方式下spring实例和初始化所有的对象并且注入到正确的地方。(servlet,web frameworks,business classes ,DAOs,etc,etc........)
回到上面的示例,使用spring我们仅仅需要在xml 确定userLister的具体的实现:
在这种方式下当视图被创建的时候,它将直接使用 userLister(spring 已经注入了实例,因为在上面的xml 已经声明了):
List users=userLister.getUsers(); // This will actually work without adding and line of code
这种方式棒极了,不是吗?
- 如果你想使用userLister 接口的另一个实现怎么办?仅仅改变xml
- 如果 userLister接口,你还没有准备实现怎么办?编写一个模拟实现,简化视图的开发
- 如果我不想使用spring怎么办?那就不使用了!你的应用程序和它是不耦合的, 控制反转状态:“应用程序控制框架,而不是框架控制应用程序“
还有其他的依赖注入可以选择,但在我看来 spring非常著名并且 简单,优雅,稳定,SpringSource的人已经编写了很多的POJOs能够使spring和其他的框架集成,并且spring是非入侵式的。
spring也有很多其他的子项目,例如:spring mvc ,spring WebFlow,spring Security 。
希望能够帮助你,不论如何,我鼓励你去读以下 Martin Fowler's article
的依赖注入和控制反转的文章,因为他比我讲的好。在我看来,它是我看过最好的关于spring 的书。
补充: 框架是帮助我们编码,但是不要成为框架的奴隶。
关注我的公众号第一时间阅读有趣的技术故事
扫码关注:
也可以在微信搜索公众号即可关注我:codexiulian
渴望与你一起成长进步!