Spring框架到底是什么?

我听到很多关于Spring的知识,人们都在网络上说Spring是一个很好的Web开发框架。 Spring框架到底是什么? 我如何将它用于我的Web-Java应用程序开发? 任何例子?


基本上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实例化和初始化,并被注入到正确的位置(Servlets,Web Frameworks,Business classes,DAO等等等等)。 )。

回到Spring中的示例,我们只需要为userLister字段设置一个setter,并具有这样的XML:

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

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

这种方式当视图被创建时,神奇地将有一个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,还有一些其他的等等。

    希望这可以帮助。 无论如何,我鼓励您阅读Martin Fowler关于依赖注入和控制反转的文章,因为他比我做得更好。 在了解基础之后,看看Spring Documentation,在我看来,它曾经是有史以来最好的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,或者有时您可能需要Sedan。 根据具体情况确实取决于你想要什么。

    为了解决这个问题,你希望有一个工厂模式作为创建模式。 工厂返回正确的实例。 所以最终你会得到大量的胶水代码来正确地实例化对象。 如果没有胶水代码,Spring会完成胶水代码的工作。 你用XML声明映射,并自动初始化对象。 它还为实例使用单例体系结构做了很多工作,这有助于优化内存使用。

    这也被称为控制反转。 其他的框架是Google guice,Pico容器等。

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

    春天还有很多东西可以在“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只是一个依赖注入框架工作,就像( GuicePicoContainer ,...)一样,但现在它已经成为构建企业应用程序的完整解决方案。

    春天的依赖注入,当然是春天的心脏仍然存在(你可以在这里查看其他的好答案),但春天​​还有更多......

    Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects)。 当有人谈到春天时,你必须找出他在说什么春季项目 ,它只是春天的核心,这就是所谓的春天框架 ,或者它是另一个春天的项目。

    一些值得一提的春季项目是:

  • 春季安全 - http://projects.spring.io/spring-security/
  • spring webservices - http://projects.spring.io/spring-ws/
  • 春季整合 - http://projects.spring.io/spring-integration/
  • 如果您需要为应用程序指定更多指定功能,那么您可能也会发现它:

  • 弹簧批量框架设计,使开发
    批量应用
  • Spring HATEOAS基于HATEOAS原型轻松创建REST API
  • 用于移动应用开发的spring mobilespring andriod
  • spring shell构建一个全功能的shell(aka命令行)应用程序
  • 春季云春季云数据流云应用程序
  • 还有一些小项目,例如spring-social-facebook (http://projects.spring.io/spring-social-facebook/)

    您可以使用Spring进行Web开发,因为它具有Spring MVC模块,该模块是Spring MVC 框架项目的一部分。 或者你可以使用spring与其他web框架工作,如struts2

    链接地址: http://www.djcxy.com/p/44053.html

    上一篇: What exactly is Spring Framework for?

    下一篇: How to append text to an existing file in Java