Spring框架到底是做什么的?[已关闭]

2022-08-31 04:11:12

我听到很多关于Spring的消息,人们在网络上说Spring是Web开发的一个很好的框架。简而言之,Spring Framework究竟是为了什么?为什么我应该在普通的Java上使用它。


答案 1

基本上,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 的类的实现相结合。如果我想从数据库实现切换到另一个从逗号分隔的文件获取用户列表的实现(请记住,这是一个示例),该怎么办?在这种情况下,我会再次转到我的代码并将上面的行更改为:

UserLister userLister = new UserListerCommaSeparatedFile();

对于像这样的小程序,这没有问题,但是...在具有数百个视图和类似数量的业务类的程序中会发生什么情况?维护成为一场噩梦!

弹簧(依赖注入)方法

Spring所做的是通过使用XML文件或注释来连接类,这样所有对象都由Spring实例化和初始化并注入正确的位置(Servlets,Web Frameworks,Business类,DAO等,等等,等等)。

回到Spring中的示例,我们只需要为该字段设置一个设置器,并拥有如下所示的XML文件:userLister

<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以及loooong list of etceteras。

希望这有帮助。无论如何,我鼓励你阅读马丁·福勒(Martin Fowler)关于依赖注入和控制反转的文章,因为他比我做得更好。在了解了基础知识之后,看看Spring Documentation,在我看来,曾经是有史以来最好的Spring书籍。


答案 2

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来初始化四轮,或者有时你可能想要轿车。这实际上取决于你根据具体情况想要什么。

要解决此问题,您需要将工厂模式作为创建模式。工厂返回正确实例的位置。因此,最终您将需要大量的胶水代码来正确实例化对象。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


推荐