什么是 Spring 天?我将很快回答这个问题,但首先,让我们再看一下维克多·胡戈的例子 . 这不是一个很好的例子,因为它不能证明需要一个新的框架 .
public class BaseView {
protected UserLister userLister;
public BaseView() {
userLister = new UserListerDB(); // only line of code that needs changing
}
}
public class SomeView extends BaseView {
public SomeView() {
super();
}
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
问题是Spring DI经过深思熟虑,围绕其他事情的包装器经过深思熟虑,因为其他东西都考虑到了所有东西,而Spring恰好包装好了 . MVC和REST的Spring实现以及所有其他的东西都做得不好(YMMV,恕我直言),但也有例外(Spring Security是炸弹) . So I tend to use Spring for DI, and its cool wrappers but prefer other stuff for Web (I like Tapestry a lot), REST (Jersey is really robust), etc.
0
我看到两个部分:
"What exactly is Spring for" - >请参阅victor hugo接受的答案 .
"[...] Spring is [a] good framework for web development" - >人们说这是在讨论Spring MVC . Spring MVC是Spring的众多部分之一,它是一个利用Spring的一般特性的Web框架,如依赖注入 . 它是一个非常通用的框架,因为它非常易于配置:您可以使用不同的数据库层(Hibernate,iBatis,普通JDBC),不同的视图层(JSP,Velocity,Freemarker ......)
public interface Lunch
{
public void eat();
}
public class Buffet implements Lunch
{
public void eat()
{
// Eat as much as you can
}
}
public class Plated implements Lunch
{
public void eat()
{
// Eat a limited portion
}
}
现在在我的代码中,我有一个类LunchDecide如下:
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(){
this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
//this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion
}
}
如果我不想再使用Spring怎么办?只是不要't use it! Your application isn'耦合它 . Inversion of Control州:"The application controls the framework, not the framework controls the application" .
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;
}
17 回答
Spring是Enterprise JavaBeans (EJB)技术的一个很好的替代品 . 它还具有Web框架和Web服务框架组件 .
什么是 Spring 天?我将很快回答这个问题,但首先,让我们再看一下维克多·胡戈的例子 . 这不是一个很好的例子,因为它不能证明需要一个新的框架 .
完成!所以现在即使你有数百或数千个视图,你仍然需要改变一行代码,就像在Spring XML方法中一样 . 但是改变一行代码仍然需要重新编译,而不是编辑你说的XML?好吧,我的挑剔的朋友,使用Ant和脚本!
那 Spring 天是什么?这是为了:
跟随牛群的盲人开发者
雇主谁不想雇用研究生程序员,因为他们没有在Uni教授这样的框架
项目开始时设计糟糕,需要拼凑而成(如victor hugo所示)
进一步阅读:http://discuss.joelonsoftware.com/?joel.3.219431.12
Spring非常适合将类的实例粘合在一起 . 您知道您的Hibernate类总是需要一个数据源,Spring将它们连接在一起(并且还具有数据源的实现) .
您的数据访问对象将始终需要Hibernate访问,Spring将Hibernate类连接到您的DAO中 .
另外,Spring基本上为您提供了一堆库的可靠配置,并为此提供了应该使用哪些库的指导 .
Spring真的是一个很棒的工具 . (我不是在谈论Spring MVC,只是基础框架) .
由于Spring引入了对配置的各种注释的支持,因此接受的答案不涉及注释的使用 .
Spring(依赖注入)方法
还有另一种方法可以使用XML文件连接类:注释 . 让我们使用接受的答案中的示例,并使用注释之一
@Component
,@Service
,@Repository
或@Configuration
直接在类上注册bean:上面的语句是有效的,不需要任何XML文件使用,并与另一个注释
@Autowired
连接,找到相关的实现并将其注入 .在用于获取bean实现的方法上使用
@Bean
注释 .Spring最初是一个相当简单的依赖注入系统 . 现在它很大,里面有一切(除了众所周知的厨房水槽) .
但不要担心,它非常模块化,所以你可以只使用你想要的部分 .
要了解它的全部内容,请尝试:
http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1
它可能很旧,但它是一本很好的书 .
这次专门讨论Spring的另一本好书:
http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2
它也引用了旧版本的Spring,但绝对值得一看 .
与J2EE相比,Spring是一个轻量级且灵活的框架 .
Spring容器充当控制反转 .
Spring使用AOP,即代理和单例,工厂和模板方法设计模式 .
分层体系结构:关注点和可重用层的分离以及易于维护 .
Spring 天是三件事 .
Spring处理依赖注入,我建议你阅读Martin Fowler关于依赖注入的优秀介绍 .
Spring做的第二件事是以非常优雅的方式包装优秀的Java库,以便在您的应用程序中使用 . 有一个很好的例子,请看Spring如何包装Task Executors和Quartz Scheduler .
第三,Spring提供了大量的Web实现,如REST,MVC Web框架等 . 他们认为,因为你在前两个使用Spring,也许你可以将它用于你的web应用程序所需的一切 .
问题是Spring DI经过深思熟虑,围绕其他事情的包装器经过深思熟虑,因为其他东西都考虑到了所有东西,而Spring恰好包装好了 . MVC和REST的Spring实现以及所有其他的东西都做得不好(YMMV,恕我直言),但也有例外(Spring Security是炸弹) . So I tend to use Spring for DI, and its cool wrappers but prefer other stuff for Web (I like Tapestry a lot), REST (Jersey is really robust), etc.
我看到两个部分:
"What exactly is Spring for" - >请参阅victor hugo接受的答案 .
"[...] Spring is [a] good framework for web development" - >人们说这是在讨论Spring MVC . Spring MVC是Spring的众多部分之一,它是一个利用Spring的一般特性的Web框架,如依赖注入 . 它是一个非常通用的框架,因为它非常易于配置:您可以使用不同的数据库层(Hibernate,iBatis,普通JDBC),不同的视图层(JSP,Velocity,Freemarker ......)
请注意,您可以在不使用Spring MVC的情况下在Web应用程序中很好地使用Spring . 我会说大多数Java Web应用程序都这样做,同时使用其他Web框架,如Wicket,Struts,Seam,...
优点是Dependency Injection (DI) . 这意味着外包对象创建的任务 . 让我用一个例子来解释 .
现在在我的代码中,我有一个类LunchDecide如下:
在上面的课程中,根据我们的心情,我们选择Buffet()或Plated() . 然而,这个系统是紧密耦合的 . 每次我们需要不同类型的Object时,我们都需要更改代码 . 在这种情况下,注释掉一条线!想象一下,50个不同的人使用了50个不同的类 . 这将是一个混乱的地狱 . 在这种情况下,我们需要对系统进行去耦 . 让我们重写LunchDecide课程 .
请注意,我们不是使用new关键字创建对象,而是将对Lunch Type对象的引用作为参数传递给构造函数 . 在这里,对象创建是外包的 . 此代码可以使用Xml配置文件(旧版)或Java Annotations(现代版)进行连线 . 无论哪种方式,在运行时期间将决定创建哪种类型的对象 . Xml将一个对象注入到我们的代码中 - 我们的代码依赖于Xml来完成该任务 . 因此,依赖注入(DI) . DI不仅有助于使我们的系统松散耦合,还简化了单元测试的编写,因为它允许依赖性被模拟 . 最后但并非最不重要的是,DI简化了面向方面编程(AOP),这导致了模块化的进一步解耦和增加 . 另请注意,上面的DI是构造函数注入 . DI也可以通过Setter Injection完成 - 与封装相同的普通旧setter方法 .
非常简短的总结,我会说Spring是你应用程序中的“胶水” . 它用于集成不同的框架和您自己的代码 .
在过去,我从纯粹的技术角度思考Spring框架 .
鉴于团队工作和开发企业Web应用程序的一些经验 - 我会说Spring是 decoupling (Web应用程序) decoupling 其各个元素(bean) . 更快的发展使它如此受欢迎 . Spring允许将应用程序构建(连接)的责任转移到Spring框架上 . Spring框架的 dependency injection 负责将各个bean连接/连接到工作应用程序中 .
这样,一旦定义了bean之间的接口,开发人员就可以更专注于单个组件(bean)的开发 .
对这种应用程序的测试很容易 - 主要关注的是单个bean . 它们可以很容易地解耦和模拟,因此单元测试快速而有效 .
Spring框架定义了多个专用bean,例如 @Controller ( @Restcontroller ), @Repository , @Component 以用于Web目的 . Spring与Maven一起提供了一个对开发人员来说很直观的结构 . 团队合作既简单又快捷,因为单个元素可以分开并且可以重复使用 .
基本上Spring是dependency-injection的框架,它是一种允许构建非常分离的系统的模式 .
问题
例如,假设您需要列出系统的用户,从而声明一个名为
UserLister
的接口:也许是访问数据库以获取所有用户的实现:
在您的视图中,您将需要访问一个实例(只是一个示例,请记住):
请注意,上面的代码没有初始化变量
userLister
. 我们应该做什么?如果我显式实例化这样的对象:...我将视图与访问数据库的类的实现结合起来 . 如果我想从数据库实现切换到从逗号分隔文件获取用户列表的另一个实现(请记住,这是一个示例),该怎么办?在那种情况下,我会再次转到我的代码,并通过以下方式更改最后一行:
这对于像这样的小程序没有问题,但是...在具有数百个视图和相似数量的业务类的程序中会发生什么 . 维护变成了一场噩梦!
Spring(依赖注入)方法
Spring所做的是通过使用XML文件或注释来连接类,这样所有对象都被Spring实例化并初始化并注入正确的位置(Servlet,Web框架,业务类,DAO等等) ...) .
回到Spring中的示例,我们只需要为
userLister
字段设置一个setter,并且有一个像这样的XML文件:或者更简单地使用
@Inject
在我们的视图类中注释该字段:这种方式在创建视图时,它会神奇地有一个
UserLister
准备工作 .太棒了!不是吗?
如果要使用
UserLister
接口的其他实现,该怎么办?只需更改XML即可如果没有准备好
UserLister
实施怎么办?编写UserLister
的临时模拟实现并简化视图的开发如果我不想再使用Spring怎么办?只是不要't use it! Your application isn'耦合它 . Inversion of Control州:"The application controls the framework, not the framework controls the application" .
在那里有一些其他的依赖注入选项,我认为Spring除了简单,优雅和稳定之外如此着名是SpringSource的人已经编写了许多POJO,它们有助于将Spring与许多其他常见框架集成,而不是侵入你的应用程序 . Spring还有几个很好的子项目,比如Spring MVC,Spring WebFlow,Spring Security,还有一些loooong的etceteras列表 .
希望这可以帮助 . 无论如何,我鼓励你阅读关于依赖注入和控制反转的Martin Fowler's article,因为他做得比我好 . 在了解了基础知识后,请查看Spring文档,在我看来,这是有史以来最好的Spring书 .
过去, spring 只是一个依赖注入框架工作( Guice , PicoContainer ,...),但现在有一天它是一个完整的解决方案,用于构建你 Enterprise Application .
Spring 天依赖注入,当然是 Spring 天的核心仍然存在(你可以在这里查看其他好的答案),但 Spring 天还有更多......
Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects) . 当有人谈到 Spring 天时,你必须找出他正在谈论的是什么,它是否只是 Spring 天的核心,它被称为 spring framework ,或者它是另一个 Spring 天项目 .
一些值得一提的 Spring 季项目是:
spring security - http://projects.spring.io/spring-security/
spring webservices - http://projects.spring.io/spring-ws/
spring integration - http://projects.spring.io/spring-integration/
如果您的应用程序需要更多指定功能,您也可以在那里找到它:
spring batch 批量框架旨在实现开发
批量申请
spring HATEOAS 基于HATEOAS主体轻松创建REST API
spring mobile 和 spring andriod 用于移动应用程序开发
spring shell 构建一个功能齐全的shell(又名命令行)应用程序
spring cloud 和 spring cloud data flow 用于 Cloud 应用程序
那里还有一些小项目,例如 spring-social-facebook (http://projects.spring.io/spring-social-facebook/)
您可以使用spring进行Web开发,因为它具有
Spring MVC
模块,该模块是 spring framework 项目的一部分 . 或者你可以使用spring和另一个web框架工作,比如 struts2 .Spring包含(正如Skaffman正确指出的)一个MVC框架 . 这里简单解释一下我的意见 . Spring支持服务层,Web层和业务层的隔离,但它真正做得最好的是"injection"个对象 . 所以用一个例子解释一下,考虑下面的例子:
现在在您的代码中,您有一个名为RoadTrip的类,如下所示
现在每当你想要一个Trip的实例;有时你可能想要一辆SUV来初始化FourWheel,或者有时你可能想要轿车 . 这取决于你想要的具体情况 .
要解决此问题,您需要将工厂模式作为创建模式 . 工厂返回正确实例的地方 . 所以最终你会得到很多胶水代码,只是为了正确地实例化对象 . 没有胶水代码,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
在Spring的Web应用程序中你可能想要的东西 -
Spring MVC,2.5允许您使用POJO作为Controller类,这意味着您不必从任何特定框架扩展(如Struts或Spring pre-2.5) . 控制器类也很容易测试,部分归功于依赖注入
Spring与Hibernate集成,可以很好地简化ORM解决方案的工作(大多数情况下)
使用Spring作为Web应用程序使您可以在应用程序的所有级别使用域对象 - 使用Hibernate映射的相同类是您使用的类"form beans."本质上,这将导致更强大的域模型,部分是因为它会减少课程数量 .
Spring表单标签可以更轻松地创建表单而不会有太多麻烦 .
另外,Spring很大 - 所以你可能有兴趣在Spring AOP或Spring Security等Web应用程序中使用很多其他东西 . 但是上面列出的四件事描述了在Web应用程序中使用的Spring的常见组件 .
Spring在开始时是依赖注入,然后为几乎所有东西添加包装王(封装在JPA实现上)等等) .
长篇故事...... Spring的大多数部分都提供了XML解决方案(XML脚本引擎...... brrrr),因此对于DI我使用Guice
好的库,但随着depnedenciec的增长,例如_L7405_ JDBC(可能是一个带有实名参数的Java jdbc解决方案)接下来是maven 4-5 .
使用Spring MVC(“大 spring ”的一部分)进行Web开发......它是“基于请求”的框架,有圣战“请求与组件”......由你决定
Spring框架对于针对Rest api更具体的Web开发非常有用 . 因为它是dependency injection并与其他模块集成,如spring security,spring aop,mvc framework,microservices
您构建的任何应用程序肯定需要安全性 .
如果你是一个产品,长期维护,那么你将挑战Aop概念 .
如果您的应用程序有更多的负载,那么您需要实现微服务 .
Spring在一个平台上提供所有这些功能 . 支持many modules
主要的是,spring是open source和可扩展的框架,在生命周期中随处可见自定义代码 .
Spring Data是一个提供与项目集成的项目 .
所以构建应用程序所需的一切都有Spring .