Spring框架到底是用来干什么的?

我听到很多关于春天的消息,人们在网络上说Spring是一个很好的web开发框架。简而言之,Spring框架到底是用来干什么的?为什么我要用它而不是纯Java。

285612 次浏览

Spring非常适合将类实例粘合在一起。你知道你的Hibernate类总是需要一个数据源,Spring将它们连接在一起(也有一个数据源的实现)。

数据访问对象总是需要Hibernate访问,Spring将Hibernate类连接到dao中。

此外,Spring基本上为您提供了一系列库的可靠配置,并指导您应该使用哪些库。

Spring真的是一个很棒的工具。(我说的不是Spring MVC,只是基本框架)。

Spring 包含 (正如斯卡夫曼正确指出的那样)一个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 container等。

除此之外,Spring还有验证框架,广泛支持与JDBC、iBatis和Hibernate(以及更多)合作的DAO层。对数据库事务提供出色的事务控制。

还有很多关于Spring的东西可以在像“Pro Spring”这样的好书中读到。

下面的url也可能有帮助 # EYZ0 < br > # EYZ0 < br > # EYZ0 < / p >

Spring最初是一个相当简单的依赖注入系统。现在它很大,里面什么都有(除了众所周知的厨房水槽)。

但不用担心,它是模块化的,所以你可以只使用你想要的部件。

去看看一切从哪里开始尝试:

# EYZ0

它可能很旧,但却是一本好书。

关于另一本关于春天的好书,请看:

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,但绝对值得一看。

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();

...我将视图与访问DB的类的实现结合在一起。如果我想从DB实现切换到另一个从逗号分隔的文件(记住,这是一个例子)获取用户列表的实现呢?在这种情况下,我将再次转到我的代码,并将上面的行更改为:

UserLister userLister = new UserListerCommaSeparatedFile();

这样的小程序没有问题,但是……在具有数百个视图和类似数量的业务类的程序中会发生什么?维护变成了噩梦!

Spring(依赖注入)方法

Spring所做的是使用XML文件或注释来线类,这样所有的对象都被Spring和注射实例化和初始化在正确的地方(servlet, Web框架,业务类,dao,等等,等等……)

回到Spring中的例子,我们只需要为userLister字段设置一个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

太棒了!不是吗?

  • 只需要修改XML。
  • 编写UserLister的临时模拟实现,简化视图的开发。
  • 不要用它!您的应用程序没有与它耦合。控制反转声明:“应用程序控制框架,而不是框架控制应用程序”。

还有一些其他的依赖注入选项,在我看来,除了简单、优雅和稳定之外,Spring之所以如此有名,是因为SpringSource的人编写了许多pojo,这些pojo有助于将Spring与许多其他通用框架集成在一起,而不会对应用程序造成干扰。此外,Spring还有几个不错的子项目,比如Spring MVC、Spring WebFlow、Spring Security,还有一长串等等。

希望这能有所帮助。无论如何,我鼓励你阅读马丁·福勒的文章关于依赖注入和控制反转的内容,因为他做得比我好。在理解了基础知识之后,看一下Spring Documentation,在我看来,这是有史以来最好的春季书。

你可能想在一个web应用程序中使用Spring -

  • Spring MVC,在2.5+版本中允许您使用pojo作为控制器类,这意味着您不必从任何特定的框架进行扩展(就像Struts或spring2.5之前的框架一样)。由于依赖注入,控制器类测试起来也非常简单
  • Spring与Hibernate的集成,它很好地简化了ORM解决方案的工作(在大多数情况下)
  • 在web应用程序中使用Spring可以让你在应用程序的所有级别上使用域对象——使用Hibernate映射的类就是你用作“表单bean”的类。本质上,这将导致一个更健壮的领域模型,部分原因是它将减少类的数量。
  • Spring表单标签使创建表单变得更容易,没有太多麻烦。

此外,Spring是巨大的——所以在web应用程序中使用很多其他的东西你可能会感兴趣,比如Spring AOP或Spring Security。但上面列出的四件事描述了Spring在web应用程序中使用的常见组件。

Spring是企业javabean (EJB)技术的一个很好的替代方案。它还具有web框架和web服务框架组件。

简而言之,我认为Spring是应用程序中的“粘合剂”。它用于集成不同的框架和您自己的代码。

春天有三样东西。

  1. Spring处理依赖注入,我建议您阅读Martin Fowler关于依赖注入的精彩介绍。
  2. Spring所做的第二件事是以一种非常优雅的方式包装优秀的Java库,以便在应用程序中使用。一个好的例子是Spring如何包装任务执行器和Quartz调度器。
  3. 第三,Spring提供了大量的web实现,比如REST、MVC web框架等等。他们认为,既然你在前两个方面都使用了Spring,也许你可以用它来满足你的web应用程序的所有需求。

问题是Spring DI是经过深思熟虑的,其他东西的包装也是经过深思熟虑的,因为其他东西考虑了一切,Spring只是很好地包装了它。Spring实现的MVC和REST以及所有其他东西都做得不是很好(YMMV, IMHO),但也有例外(Spring Security是个炸弹)。# EYZ0

我认为这有两部分:

  1. “春天到底是用来干什么的”——>见维克多·雨果的公认答案。
  2. “[…Spring是一个很好的web开发框架”——>人们说这是在谈论Spring MVC。Spring MVC是Spring的众多部分之一,是一个web框架,它利用了Spring的一般特性,比如依赖注入。这是一个非常通用的框架,因为它是非常可配置的:你可以使用不同的db层(Hibernate, iBatis,普通JDBC),不同的视图层(JSP, Velocity, Freemarker…)

注意,不使用Spring MVC,你也可以在web应用程序中很好地使用Spring。我想说,大多数Java web应用程序都这样做,同时使用其他web框架,如Wicket, Struts, Seam,…

春天是用来干什么的?我会简短地回答这个问题,但首先,让我们再看看维克多·雨果的例子。这不是一个很好的例子,因为它没有证明需要一个新的框架。

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);
}
}
< p >完成了!因此,现在即使您有数百或数千个视图,您仍然只需要更改一行代码,就像Spring XML方法中那样。 但是更改一行代码仍然需要重新编译,而不是编辑XML。好吧,我的挑剔的朋友,使用Ant和脚本!< / p >

那么春天是用来干什么的呢?这是为:

  1. 盲目的开发者随大流
  2. 雇主不想雇佣毕业的程序员,因为他们在大学里没有教过这样的框架
  3. 从一个糟糕的设计开始,需要修补的项目(如维克多·雨果的例子所示)

进一步阅读:http://discuss.joelonsoftware.com/?joel.3.219431.12

Spring一开始是依赖注入,然后为几乎所有的东西添加了包装之王(JPA实现的包装等)。

说来话长……Spring的大多数部分更倾向于XML解决方案(XML脚本引擎…brrrr),所以对于DI,我使用Guice

很好的库,但是随着依赖性的增长,例如春天 JDBC(可能是一个具有实名参数的Java JDBC解决方案)从maven 4-5中获得。

使用Spring MVC(“big Spring”的一部分)进行web开发…它是“基于请求的”框架,有“请求vs组件”的圣战…由你决定

以前,春天只是一个依赖注入框架,就像(GuicePicoContainer,…),但现在它是构建企业应用程序的完整解决方案。

spring依赖注入,当然,spring的核心仍然在那里(你可以在这里查看其他好的答案),但是还有更多来自spring的答案……

Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects)。当有人谈到弹簧时,你必须弄清楚他说的是什么春天项目,是仅仅是弹簧核心,也就是众所周知的spring框架,还是另一个弹簧项目。

值得一提的春季项目有:

  • # eyz0 - # eyz1
  • # eyz0 - # eyz1
  • # eyz0 - # eyz1

如果你的应用程序需要一些更指定的功能,你也可以在那里找到:

  • Spring Batch批处理框架设计,使开发
    批处理应用程序李< / >
  • 基于HATEOAS原理轻松创建REST API
  • 春天的移动春天Andriod用于移动应用程序开发
  • 春天的壳构建一个功能齐全的shell(又名命令行)应用程序
  • 春云春云数据流用于云应用程序

还有一些小项目,例如spring-social-facebook (http://projects.spring.io/spring-social-facebook/)

你可以使用spring进行web开发,因为它有Spring MVC模块,这是Spring框架项目的一部分。或者你可以将spring与另一个web框架一起使用,比如struts2

优点是依赖注入(DI)。这意味着将对象创建任务外包出去。让我用一个例子来解释。

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
}
}

在上面的类中,根据心情选择Buffet()或Plated()。但是这个系统是紧密耦合的。每次需要不同类型的对象时,我们都需要更改代码。在本例中,注释掉一行!假设有50个不同的人使用50个不同的类。那会是一团乱麻。在这种情况下,我们需要解耦系统。让我们重写LunchDecide类。

public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
注意,我们没有使用new关键字创建对象,而是将Lunch Type对象的引用作为参数传递给构造函数。在这里,对象创建是外包的。这些代码可以使用Xml配置文件(传统)或Java注释(现代)进行连接。无论哪种方式,将在运行时期间决定创建哪种类型的对象。一个对象将被Xml注入到我们的代码中——我们的代码依赖于Xml来完成这项工作。因此,依赖注入(DI)。 DI不仅有助于使我们的系统松散耦合,还简化了单元测试的编写,因为它允许模拟依赖关系。最后但并非最不重要的一点是,DI简化了面向方面的编程(AOP),从而进一步解耦和增加了模块化。 还要注意上面的DI是构造函数注入。DI也可以通过Setter注入来完成——同样是封装的普通Setter方法。< / p >

公认的答案不涉及注释的使用,因为Spring为配置引入了对各种注释的支持。

Spring注释方法(依赖注入)

还有另一种使用XML文件连接类的方法:注释。让我们使用接受的答案中的示例,并使用注释@Component@Service@Repository@Configuration之一直接在类上注册bean:

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

这样,当视图创建时,它将神奇地有一个UserLister准备工作。

上面的语句是有效的,它不需要使用任何XML文件,并与另一个注释@Autowired连接,该注释可以找到相关的实现并将其注入其中。

@Autowired
private UserLister userLister;

在用于获取要注入的bean实现的方法上使用@Bean注释。

  • 与J2EE相比,Spring是一个轻量级且灵活的框架。
  • 弹簧容器充当了控制的反转。
  • Spring使用AOP,即代理和单例、工厂和模板方法设计模式。
  • 分层架构:分离关注点和可重用层,易于维护。

enter image description here

Spring框架绝对适合web开发,尤其适合restful api服务。

它是好的,因为它的依赖注入和集成其他模块,如spring securityspring aopmvc框架微服务

在任何应用程序中,安全性很可能是一个需求。
如果你的目标是构建一个需要长期维护的产品,那么你将需要利用Aop的概念
如果你的应用程序有太多的流量,从而增加了负载,你需要使用微服务的概念。

Spring在一个平台中提供了所有这些特性。支持很多模块
最重要的是,spring是开源和一个可扩展的框架,在生命周期中到处都有一个钩子来集成自定义代码。

春天数据是一个提供与您的项目集成的项目。

< p > < br > 所以spring可以满足几乎所有的需求

过去,我从纯技术的角度考虑Spring框架。

鉴于一些团队工作和开发企业web应用程序的经验,我会说Spring是为更快地开发应用程序 (web应用程序)而不是解耦的单个元素(bean)。更快的发展使它如此受欢迎。Spring允许将构建(连接)应用程序的责任转移到Spring框架上。Spring框架的依赖注入负责将单个bean连接到一个工作应用程序中。

这样,一旦定义了bean之间的接口,开发人员就可以更专注于单个组件(bean)的开发。

测试这样的应用程序很容易——主要的关注点是单个bean。它们可以很容易地解耦和模拟,因此单元测试是快速和有效的。

Spring框架定义了多个专门的bean,如@ controller (@Restcontroller), @@ component,以服务于web目的。Spring和Maven一起提供了一个对开发人员来说很直观的结构。 团队工作简单快捷,因为单独的元素是分开的,可以重复使用