据我所知,我们使用spring IOC,以便开发人员可以通过显式提供依赖项来轻松检查xml文件以识别和控制代码流。
但是,如果我们使用自动装配,开发人员实际上必须检查代码以识别将哪个实现自动装配到给定的类
例如,如果不实际使用spring框架就可以实现相同的目的,那么为什么我们需要spring或在这种情况下使用spring的真正优势是什么呢。
Interface Vehicle {
.....
}
Class Car implements Vehicle {
......
}
Class Example {
Vehicle v = new Car()
}
或
Class Example {
@Autowire
Vehicle v;
....
}
答案 0 :(得分:3)
这是一个很好的问题!。现在,以最好的方式寻求答案,我认为故事的内容会有所帮助。
Spring诞生于EJB时代,当时所有的东西都以xml配置,而Spring最初是一个Java框架,用于提供基于IOC POJO的功能。在这个时代,完全以xml配置我们的应用程序是一个不错的选择,因为spring可以使IOC受益,而无需EJB复杂性,并且可以采用无供应商的方式,EJB并非完全没有应用服务器,因为有时供应商的实现(尤其是针对供应商的实现)特定的配置使应用程序不能完全移植,spring是一个成功的框架,因为它是解决EJB应用程序几乎所有问题的解决方案。然后,框架的成功带来了框架的发展,并包括其他功能,例如数据访问,Web集成以及其他更多集成和功能。
近年来,JavaEE也不断发展,在JavaEE 6中诞生了CDI Spring,它提供xml,注解,java config groovy,kotlin dsl bean配置,以实现灵活性并提供舒适的编程和配置模型,请所有人考虑来自JabaEE 6+的版本,通常使用@Inject提供DI。现在说所有这些DI功能都由开发人员自行决定。
在我看来,使用@Autowired是危险的,因为这会永远带您到Spring,并且如果配置了多个bean,那么许多DI可能会到来。从Spring 4.3.x开始,为了加强Spring团队的努力,让您感到舒适和自由选择配置,您可以像
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影响,即使rest控制器上的构造函数不需要@Autowired注释,当然您已经配置了它。
最后,我可以说您不应该使用Spring,因为Spring提供了IOC,这可以通过Java Juice,Google Juice,Spring和许多其他IOC框架来实现,但是我建议您将Spring用于所有相关项目为您提供了许多生产准备就绪的功能,例如用于阻塞IO的Spring Web,用于无阻塞IO的Spring WebFlux,用于EIP的Spring Integration,用于企业就绪的Spring批处理,用于云本机应用程序的Spring Cloud以及越来越多的功能春天到今天的灵活性和完整性,当然,蜘蛛侠的定律是有效的!大国对我们负有重大责任。 Spring给您带来许多可能性,但是开发人员有责任选择最好的。注释特别是在原型制作过程中为您提供了速度,但过于僵化。 我希望这种漫长的思考能给您解答您的疑问
答案 1 :(得分:-1)
这样,问题是车辆“ v”与汽车紧密耦合,输出生成器的每次更改都可能涉及代码更改。如果此代码分散在您的整个项目中,那么对Vehicle的每次更改都会使您遭受严重的痛苦。