我听说过很多有关Spring的信息,人们在网络上都说Spring是Web开发的良好框架。Spring Framework到底是做什么用的?
我听说过很多有关Spring的信息,人们在网络上都说Spring是Web开发的良好框架。Spring Framework到底是做什么用的?
Answers:
基本上,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();
这样的小程序没有问题,但是...在具有数百个视图和类似数量的业务类的程序中会发生什么?维护成了一场噩梦!
什么春天确实是来连线通过使用XML文件或注解,这样所有的对象实例化和春天初始化和班达注射在适当的地方(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
太好了!是不是
UserLister
接口的其他实现怎么办?只需更改XML。UserLister
准备好实施该怎么办?对时态模拟实现进行编程,UserLister
并简化视图的开发。依赖注入还有其他选择,在我看来,Spring除了简单,优雅和稳定外,还让Spring如此出名是因为SpringSource的人已经编写了许多POJO,这些POJO有助于将Spring与许多其他通用框架集成在一起。侵入您的应用程序。而且,Spring有几个不错的子项目,例如Spring MVC,Spring WebFlow,Spring Security以及大量的etceteras列表。
希望这可以帮助。无论如何,我鼓励您阅读Martin Fowler关于依赖注入和控制反转的文章,因为他比我做得更好。了解基本看一看之后Spring文档,在我看来,这是 曾经是最好的春季书永远。
Spring 包含(如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,有时您可能想要轿车。这实际上取决于您根据特定情况想要的内容。
要解决此问题,您需要将工厂模式用作创建模式。工厂返回正确实例的位置。因此,最终您将获得大量粘合代码,仅用于正确实例化对象。如果没有粘合代码,Spring会最好地执行粘合代码的工作。您以XML声明映射,它会自动初始化对象。在实例中使用单例架构也很有用,这有助于优化内存使用。
这也称为控制反转。其他实现此目的的框架是Google guice,Pico容器等。
除此之外,Spring还具有验证框架,与JDBC,iBatis和Hibernate(以及更多)协作,对DAO层提供了广泛的支持。提供对数据库事务的出色事务控制。
Spring可以在诸如“ Pro Spring”之类的好书中阅读,还有更多内容。
跟随URL也可能有帮助。
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是依赖注入框架(仅类似于Guice,PicoContainer等),但如今,它是构建企业应用程序的完整解决方案。
spring依赖注入,当然,这仍然是spring的核心(您可以在这里查看其他好的答案),但是spring还有更多...
Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects)。当某人谈论Spring时,您必须找出他正在谈论的Spring项目,是仅Spring核心(被称为Spring Framework),还是另一个Spring项目。
一些春季项目值得一提:
如果您需要为应用程序提供更多指定功能,则也可以在其中找到它:
那里还有一些小项目,例如spring-social-facebook(http://projects.spring.io/spring-social-facebook/)
您可以将spring用于Web开发,因为它具有Spring Framework项目中的Spring MVC
模块。或者,您可以将spring与其他Web框架一起使用,例如struts2。
春天有什么用?我将很快回答这个问题,但首先,让我们再看一看胜利者雨果的例子。这不是一个很好的例子,因为它不能证明对新框架的需求。
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 XML方法一样只需要更改一行代码。但是更改一行代码仍然需要重新编译,而不是编辑XML。好吧,我挑剔的朋友,请使用Ant并删除脚本!
那么Spring的目的是什么?它用于:
UserLister
),但是如果视图需要多个服务,而不是在不同BaseView
子对象之间共享,该怎么办?(幸运的是)Java中没有多重继承。
春天是三件事。
问题在于,Spring DI确实经过深思熟虑,围绕其他事物的包装确实经过了深思熟虑,因为其他事物认为一切都已解决,而Spring恰好将其包装好。MVC和REST以及其他所有东西的Spring实现都做得不好(YMMV,恕我直言),但是有例外(Spring Security是炸弹)。因此,我倾向于将Spring用于DI及其出色的包装器,但更喜欢Web(我非常喜欢Tapestry),REST(Jersey确实很健壮)等其他东西。
使用Spring在Web应用程序中可能想要的-
此外,Spring非常庞大-因此,您可能会对在Web应用程序中使用很多其他东西感兴趣,例如Spring AOP或Spring Security。但是上面列出的四件事描述了Web应用程序中使用的Spring的常见组件。
我看到两个部分:
请注意,您可以在Web应用程序中完美使用Spring,而无需使用Spring MVC。我会说大多数Java Web应用程序都这样做,而使用了诸如Wicket,Struts,Seam等其他Web框架。
可接受的答案不涉及注释的使用,因为Spring引入了对各种配置注释的支持。
还有另一种使用XML文件将类连接在一起的方法:注释。让我们用从接受答案的例子,并直接使用注释的一个类注册豆@Component
,@Service
,@Repository
或@Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
这样,在创建视图时,它会神奇地使UserLister就绪。
上面的语句是有效的,并且不需要任何XML文件使用,也不需要与其他注释@Autowired
相关的实现发现并注入的注释。
@Autowired
private UserLister userLister;
使用@Bean
注释上用来获取bean的实现注入的方法。
@Bean
在课程级别使用注释。必须是一@Component
,@Service
,@Repository
等休息是正确的。您可能还应该指出,只有在类路径中只有一个适合注入的候选类时,这种方式的自动装配接口才有效,否则,Spring应用程序错误。
优点是依赖注入(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()。但是,该系统紧密耦合。每当我们需要不同类型的Object时,我们都需要更改代码。在这种情况下,注释掉一行!想象一下,有50个不同的类别,供50个不同的人使用。真是一团糟。在这种情况下,我们需要解耦系统。让我们重写LunchDecide类。
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
注意,不是使用new关键字创建对象,而是将对午餐类型的对象的引用作为参数传递给构造函数。在这里,对象创建是外包的。可以使用Xml配置文件(旧版)或Java注释(现代版)连接此代码。无论哪种方式,都将在运行时期间决定要创建哪种类型的对象。Xml将对象注入到我们的代码中-我们的代码依赖于Xml来完成该工作。因此,依赖注入(DI)。DI不仅有助于使我们的系统松散耦合,而且由于可以模拟依赖关系,因此简化了单元测试的编写。最后但并非最不重要的一点是,DI简化了面向方面的编程(AOP),这导致了进一步的去耦和模块化的提高。还要注意,上面的DI是构造函数注入。
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Spring是Enterprise JavaBeans(EJB)技术的很好的替代品。它还具有Web框架和Web服务框架组件。
Spring最初是一个非常简单的依赖项注入系统。现在它很大了,里面有一切(众所周知的厨房水槽除外)。
但是不要担心,它是模块化的,因此您可以只使用所需的部件。
要查看一切从哪里开始,请尝试:
它可能很旧,但是很不错。
对于这次专门专门针对Spring的另一本好书,请参阅:
它还引用了Spring的旧版本,但是绝对值得一看。
Spring从一开始就是依赖注入,然后为几乎所有内容(包装JPA实现等)添加了包装王。
长话短说... Spring首选XML解决方案的大部分内容(XML脚本引擎... brrrr),因此对于DI来说,我使用Guice
好的库,但是随着depnedenciec的增长,例如Spring JDBC(也许是一个带有实名参数的Java jdbc解决方案)接下来是maven 4-5。
使用Spring MVC(“大春天”的一部分)进行Web开发...它是“基于请求”的框架,有一场“请求与组件”的圣战...由您决定
过去,我从纯粹的技术角度考虑过Spring框架。
有了一些团队合作和开发企业Webapp的经验,我想说Spring可以通过以下方式更快地开发应用程序(Web应用程序)分离其各个元素(bean)。更快的开发使其如此受欢迎。Spring允许将构建(连接)应用程序的责任转移到Spring框架上。Spring框架的依赖项注入负责将各个bean连接/连接到一个正在运行的应用程序中。
这样,一旦定义了bean之间的接口,开发人员便可以更加专注于单个组件(bean)的开发。
这种应用程序的测试很容易-主要重点放在各个bean上。它们可以轻松地解耦和模拟,因此单元测试是快速而有效的。
Spring框架定义了多个专用Bean,例如@Controller(@Restcontroller),@Repository和@Component来实现Web目的。Spring与Maven一起提供了对开发人员直观的结构。团队合作既容易又快速,因为各个要素分开放置并且可以重复使用。
Spring框架绝对适合Web开发,并且更适合静态api服务。
由于它的依赖关系注入 以及与其他模块(如spring安全,spring aop,mvc框架,微服务)的集成,因此对上述内容有好处
在任何应用程序中,最有可能需要安全性。
如果您打算构建需要长期维护的产品,那么您将需要利用Aop概念。
如果您的应用程序流量很大,从而增加了负载,则需要使用微服务概念。
Spring在一个平台上提供了所有这些功能。支持许多模块。
最重要的是,spring是开源的并且是可扩展的框架,处处都有一个挂钩,可以在生命周期中集成自定义代码。
Spring Data是一个提供与您的项目集成的项目。
因此,弹簧几乎可以满足所有要求。