问题
我听到很多关于Spring的消息,人们在网上都说Spring是一个很好的Web开发框架。 Spring Framework究竟是什么?如何将它用于我的Web-Java应用程序开发?任何例子?
#1 热门回答(620 赞)
基本上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框架,业务类,DAO等等......) 。
回到Spring中的示例,我们只需要为userLister
field设置一个setter,并且有一个像这样的XML文件:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
或者更简单地使用@Inject
在我们的视图类中注释该字段:
@Inject
private UserLister userLister;
这种方式在创建视图时,它会有一个UserLister
已经可以工作。
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
太好了!不是吗?
- 如果要使用UserLister接口的其他实现,该怎么办?只需更改XML即可
- 如果没有准备好UserLister实现怎么办?编写UserLister的临时模拟实现并简化视图的开发
- 如果我不想再使用Spring怎么办?只是不要使用它!你的应用程序未与其耦合。控制反转状态:"应用程序控制框架,而不是框架控制应用程序"。
在那里有一些其他的依赖注入选项,我认为Spring除了简单,优雅和稳定之外如此着名是SpringSource的人已经编写了许多POJO,它们有助于将Spring与许多其他常见框架集成,而不是侵入你的应用程序。 Spring还有几个很好的子项目,比如Spring MVC,Spring WebFlow,Spring Security,还有一些loooong的etceteras列表。
希望这可以帮助。无论如何,我鼓励你阅读Martin Fowler's article关于依赖注入和控制反转,因为他做得比我好。理解了基础知识后看看Spring Documentation,在我看来itis曾经是有史以来最好的春季书。
#2 热门回答(56 赞)
Springcontains(正如Skaffman正确指出的那样)是一个MVC框架。这里简单解释一下我的意见。 Spring支持服务层,Web层和业务层的隔离,但它最真实的是"注入"对象。所以用一个例子解释一下,考虑下面的例子:
public interface FourWheel
{
public void drive();
}
public class Sedan implements FourWheel
{
public void drive()
{
//drive gracefully
}
}
public class SUV implements FourWheel
{
public void drive()
{
//Rule the rough terrain
}
}
现在在你的代码中,你有一个名为RoadTrip的类,如下所示
public class RoadTrip
{
private FourWheel myCarForTrip;
}
现在每当你想要一个Trip的实例;有时你可能想要一辆SUV来初始化FourWheel,或者有时你可能想要Sedan。这取决于你想要的具体情况。
要解决此问题,你需要将工厂模式作为创建模式。工厂返回正确实例的地方。所以最终你会得到很多胶水代码,只是为了正确地实例化对象。没有胶水代码,Spring可以最好地完成胶水代码的工作。你在XML中声明映射并自动初始化对象。对于实例而言,它也使用单例体系结构,并且有助于优化内存使用。
这也称为控制反转。其他框架是谷歌guice,Pico容器等。
除此之外,Spring还提供了验证框架,与JDBC,iBatis和Hibernate(以及更多)合作,对DAO层提供了广泛的支持。为数据库事务提供出色的事务控制。
Spring中还有很多东西可以在像"Pro Spring"这样的好书中读到。
以下网址也可能有所帮助。
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework
#3 热门回答(26 赞)
过去,春天是一个依赖注入框架工作只有像(Guice,PicoContainer,...),但现在一天它是一个完整的解决方案,建立你企业应用程序。
春天依赖注入,当然是春天的核心仍然存在(你可以在这里查看其他好的答案),但春天还有更多......
Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects)。当有人谈到春天时,你必须找出所说的春天项目是什么,它只是春天的核心,它被称为春天框架**,或者它是另一个春天项目。
一些值得一提的春季项目是:
- 春季安全 - http://projects.spring.io/spring-security/
- spring webservices - http://projects.spring.io/spring-ws/
- spring integration - http://projects.spring.io/spring-integration/
如果你的应用程序需要更多指定功能,你也可以在那里找到它:
- 弹簧批处理批处理框架,旨在实现批处理应用程序的开发
- spring HATEOAS基于HATEOAS主体轻松创建REST api
- 用于移动应用程序开发的spring mobile和spring andriod
- spring shell构建一个功能齐全的shell(也就是命令行)应用程序
- 云应用程序的spring cloud和spring cloud数据流
那里也有一些小项目例如spring-social-facebook(http://projects.spring.io/spring-social-facebook/)
你可以使用spring进行Web开发,因为它具有Spring MVC
module,它是spring frameworkproject的一部分。或者你可以使用弹簧与另一个web框架工作,如struts2。