问题: 确切的说spring框架是做什么?
描述:我听到了许多关于spring,大家都说在web的世界里做开发spring是非常好的一个框架。但是确切的说它是做什么的?我在开发中如何使用它,有没有示例?

回答:
使用spring可以使你的代码耦合度很低,它最基本的概念是依赖注入。
我将尽我所能给你一个最简单的示例。

问题: 你需要实现一个用户系统并且已经声明了一个接口:UserLister

public interface UserLister{
	List<User> getUsers();
}

实现上面的接口,你需要访问数据库获取到所有用户。

public class UserListerDB implements UserLister{
	public LisT<User> getUsers(){
		//DB access code here
	}
}

在你的视图里,你需获得一个实例(记住,下面的仅仅是例子):

public class SomeView{
	private UserLister userLister;
	
	public void render(){
		List<User> 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的具体的实现:

<bean id="userLister" class="UserListerDB"  />

<bean class="Someview">
	<property  name="userLister" ref="userLister" />
</bean>

在这种方式下当视图被创建的时候,它将直接使用 userLister(spring 已经注入了实例,因为在上面的xml 已经声明了):

List<User> 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 的书。

原文

补充: 框架是帮助我们编码,但是不要成为框架的奴隶。

更多推荐

确切的说spring框架是做什么的?(翻译自stackoverflow的一个回答)