Skip to main content
 首页 » 编程设计

spring中当我们可以使用接口(interface)实现松散耦合的代码时,为什么还要使用 Spring 框架呢

2025年05月04日85unruledboy

据我所知,我们使用 Spring IOC,以便开发人员可以轻松检查 xml 文件,通过显式提供依赖项来识别和控制代码流。

但是如果我们使用 Autowiring ,开发人员实际上必须检查代码以确定哪个实现 Autowiring 到给定的类

即使不实际使用 spring 框架也可以实现同样的效果,那么为什么我们需要 spring 或者在这种情况下使用 spring 的真正优势是什么。

Interface Vehicle { 
  ..... 
} 
 
Class Car implements Vehicle { 
  ...... 
} 
 
Class Example { 
  Vehicle v = new Car() 
} 

或者

Class Example { 
 
  @Autowire 
  Vehicle v; 
  .... 
} 

请您参考如下方法:

这是一个非常好的问题!现在,为了以最好的方式回答,我认为一点故事会有所帮助。

Spring诞生于一切都在xml中配置的EJB时代,Spring最初是一个基于POJO提供IOC的java框架。在这个时代,在 xml 中配置我们的应用程序是完全正常的,而 spring 是一个不错的选择,因为我们可以在没有 EJB 复杂性的情况下受益于 IOC,并且以供应商无关的方式,EJB 并不完全免费应用程序服务器,因为有时供应商实现特别是针对供应商特定的配置使应用程序不完全可移植,Spring 是一个成功的框架,因为它解决了 EJB 应用程序的几乎所有问题。然后,框架的成功使框架不断发展,并包含其他功能,如数据访问、Web 集成以及更多其他集成和功能。

在这一年中,JavaEE 也不断发展,JavaEE 6 诞生了,CDI Spring 提供了 xml、annotation、java config、groovy、kotlin dsl bean 配置,以实现灵活性并提供舒适的编程和配置模型,为所有人考虑来自 JabaEE 6+,通常使用 @Inject 提供 DI。现在说所有这些 DI 功能都由开发人员自行决定。

在我看来,使用 @Autowired 是危险的,因为这会让你永远使用 Spring,并且如果配置了多个 Bean,就会出现许多 DI 问题。为了加强 Spring 团队的努力,从 Spring 4.3.x 开始为您提供舒适和自由的配置选择,您可以像这样思考

interface Vehicle { 
 
} 
 
class Car implements Vehicle { 
} 
 
class Example { 
 
    private final Vehicle vehicle; 
 
    Example(Vehicle vehicle) { 
        this.vehicle = vehicle; 
    } 
} 
 
 
@Configuration 
class Config{ 
 
    @Bean 
    public Car car(){ 
        return new Car(); 
    } 
 
    @Bean 
    public Example example(Vehicle car){ 
        return new Example(car); 
    } 
} 
 
@RestController 
class Enpoint{ 
    private final Example example; 
 
    Enpoint(Example example) { 
        this.example = example; 
    } 

你的业务代码现在完全脱离了spring,即使其余 Controller 上的构造函数也不需要@Autowired注释,当然你已经配置了它。

最后我可以说你应该使用 Spring 不是因为 Spring 提供了 IOC,这可以通过 Google Juice、Spring 和许多其他 IOC 框架以纯 Java 方式实现,但我建议你使用 Spring 来完成所有工作相关项目为您提供了许多生产准备就绪的功能,例如用于阻塞 IO 的 Spring Web、用于无阻塞 IO 的 Spring WebFlux、用于 EIP 的 Spring Integration、用于企业就绪 Batch 的 Spring Batch、用于云原生应用程序的 Spring Cloud 等等, Spring到今天就是灵活性和完备性,蜘蛛侠定律当然有效!我们对大国负有重大责任。 Spring 给了你很多可能性,但是开发者有责任选择最好的。注释可以提高速度,尤其是在原型(prototype)设计过程中,但之后就太僵化了。 我希望这篇长篇反射(reflection)能够解答您的疑问