1、IoC的基本概念
- IoC,即控制反转,是一种设计思想,用于降低代码之间的耦合度。在传统的程序设计中,对象的创建和对象之间的依赖关系通常由对象自身来管理。而在IoC思想中,这种控制权被“反转”了,交由一个外部容器(在Spring中就是IoC容器)来管理。
- IoC也被称为依赖注入(Dependency Injection,DI)。这意味着,对象不再自己查找其依赖或使用工厂模式来创建其依赖,而是由容器负责将这些依赖“注入”到对象中。
2、Spring IoC容器的实现
- Spring提供了IoC容器的两种实现方式:BeanFactory和ApplicationContext。其中,ApplicationContext是BeanFactory的子接口,提供了更多企业级的功能,如事件传播、资源加载等。在实际开发中,ApplicationContext更为常用。
- 当应用程序启动时,Spring IoC容器会根据配置文件或注解来创建和管理bean。这些bean之间的依赖关系也由容器来管理。
3、IoC的优点
- 降低耦合度:通过IoC容器来管理对象之间的依赖关系,可以降低代码之间的耦合度,提高代码的可维护性和可扩展性。
- 提高开发效率:开发人员无需关心对象的创建和依赖管理,可以专注于业务逻辑的实现,从而提高开发效率。
- 方便测试:由于对象的创建和依赖关系都由容器来管理,因此可以方便地替换依赖项以进行单元测试或集成测试。
4、Spring IoC的注入方式
Spring IoC支持三种主要的注入方式:构造器注入、setter方法注入和根据注解注入。这些方式可以根据实际需求灵活选择。
4.1构造方法注入
- 在这种方式中,依赖关系是通过目标类的构造函数传递的。
- 容器在实例化Bean时,会调用目标类的构造函数,并传入所需的依赖项。
- 这种方式可以保证依赖项的完整性,使得类在实例化之初就已具备所需的依赖。
- 构造方法注入比较直观,对象被构造完成后即进入就绪状态,可以立即使用。
// 定义一个服务接口
public interface GreetingService {
String greet();
}
// 实现服务接口
public class SimpleGreetingService implements GreetingService {
private final String greeting;
// 使用构造方法进行注入
public SimpleGreetingService(String greeting) {
this.greeting = greeting;
}
@Override
public String greet() {
return greeting;
}
}
// Spring配置文件(XML方式)
<bean id="greetingService" class="com.example.SimpleGreetingService">
<constructor-arg value="Hello, World!"/>
</bean>
或者使用Java配置类
@Configuration
public class AppConfig {
@Bean
public GreetingService greetingService() {
return new SimpleGreetingService("Hello, World!");
}
}
4.2setter方法注入
- 容器实例化Bean之后,会调用该Bean的setter方法来注入依赖。
- 需要在类中提供对应的setter方法,以便容器可以调用并注入依赖。
- 这种方式相较于构造方法注入更加灵活,可以在对象创建后的任意时间点进行依赖注入
public class ComplexGreetingService implements GreetingService {
private String greeting;
public void setGreeting(String greeting) {
this.greeting = greeting;
}
@Override
public String greet() {
return greeting;
}
}
// Spring配置文件(XML方式)
<bean id="complexGreetingService" class="com.example.ComplexGreetingService">
<property name="greeting" value="Hello from Setter Injection!" />
</bean>
或者使用Java配置类
@Configuration
public class AppConfig {
@Bean
public GreetingService complexGreetingService() {
ComplexGreetingService service = new ComplexGreetingService();
service.setGreeting("Hello from Setter Injection!");
return service;
}
}
3、注解注入
- 注解注入即通过注解来指定需要注入的依赖,由Spring容器在运行时自动完成依赖的注入工作。
- 使用@Autowired注解可以实现自动装配,Spring会自动将匹配的Bean注入到需要的字段、构造函数或setter方法中。
@Service
public class GreetingController {
private final GreetingService greetingService;
@Autowired // 通过注解进行构造方法注入
public GreetingController(GreetingService greetingService) {
this.greetingService = greetingService;
}
public String sayHello() {
return greetingService.greet();
}
}
或者在字段上使用@Autowired
@Service
public class GreetingController {
@Autowired // 通过注解进行字段注入
private GreetingService greetingService;
public String sayHello() {
return greetingService.greet();
}
}
标签:依赖,Spring,greeting,spring,IoC,public,注入
From: https://blog.csdn.net/wosixiaokeai/article/details/139073395