【Spring框架一】——Spring框架简介
【Spring框架三】——Spirng IOC和DI的实现
本篇博客主要讲解的是Spring 的IOC以及DI(依赖注入)的基本概念和优势利弊,如果想知道如何实现Spring IOC与DI可以访问博主的另外一篇博客。
【Spring框架三】——Spirng IOC和DI的实现
它的核心思想是将对象的创建和管理交给容器来完成,而不是由程序员手动创建和管理对象。
在Spring中IOC是通过Bean容器来实现的。当Spring容器启动时,会自动创建和管理一些Bean对象,并将它们放入容器中。程序员可以通过IOC容器来获取需要的Bean对象,而无须手动创建或管理对象。
Spring的IOC容器通过依赖注入(Dependency Injection来完成对Bean的管理,依赖注入是指在创建Bean对象时,自动将它所依赖的对象注入到Bean中。通过依赖注入,程序员可以很方便的解耦和管理Bean对象之间的依赖关系。
在Spring中,IOC容器可以通过XML配置文件和注解等方式进行配置和管理。通过IOC容器,程序员可以很方面的创建和管理对象,可以实现对象之间的松耦合,提高系统的可扩展性和可维护性。
在传统的编程模式中,对象之间通常是紧耦合的,即一个对象依赖另一个对象才能完成其工作。
Spring的IOC容器可以帮助我们实现对象之间的松耦合。当对象A需要使用对象B时,它不需要自己去创建对象B,而是将这个任务委托给Spring IOC容器。由Spring IOC容器负责创建和管理对象B的实例,并将其注入到对象A中。这样对象A就可以专注于自己的业务逻辑,而不必关心对象B是如何创建和管理的。这样的话,当对象B发送变化,只需要修改Spring IOC容器中对象B的定义,而不需要修改对象A的代码。这样解耦和方式可以提高应用程序的可维护性和扩展性。
具体业务:假设有一个订单管理系统,其中包含两个服务类 OrderService 和 PaymentService。OrderService 需要调用 PaymentService 进行支付操作。
现在我们使用 Spring IOC 容器来管理这两个服务类。
首先,定义 PaymentService 接口和两个实现类 ClassB 和 NewClassB:
注意:只需要理解宏观业务,以及宏观上是通过Spring IOC和DI如何实现的,忽略细节能够更好的理解,如忽略@Service这个注解是做什么的等等。
代码如下:
public interface PaymentService {
void pay();
}
@Service
public class ClassB implements PaymentService {
@Override
public void pay() {
System.out.println("Pay with ClassB");
}
}
@Service
public class NewClassB implements PaymentService {
@Override
public void pay() {
System.out.println("Pay with NewClassB");
}
}
然后,在 OrderService 中通过 @Autowired 注解将 PaymentService 注入进来:
代码如下:
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
public void placeOrder() {
System.out.println("Place order...");
paymentService.pay();
}
}
现在,如果我们想要更换支付实现方式,只需要在 Spring IOC 容器中修改 PaymentService 的定义即可,例如将 ClassB 替换为 NewClassB:
代码如下:
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public PaymentService paymentService() {
return new NewClassB();
}
}
这样一来,OrderService 的代码不需要做任何修改,它仍然可以通过 Spring IOC 容器获取到 PaymentService 的实例,并调用其中的方法,以完成支付操作。这样,就可以大大降低代码的耦合性,提高代码的可维护性。
备注:对于注解的作用会再之后的Spring框架的系列博客中进行讲解。
目前只是对于Spring框架的IOC和DI有一个宏观的上的认识,具体如何使用Spring框架来实现IOC和DI将在后续博客进行总结和实践。