IoC(Inversion of Control,控制反转)容器是 Spring 框架的核心组件之一。它负责创建对象、管理对象的生命周期以及对象之间的依赖关系。通过将对象的创建和管理交给 IoC 容器,开发者可以实现代码的松耦合,提高代码的可测试性和可维护性。
BeanFactory
:这是 Spring IoC 容器的核心接口,提供了基本的 IoC 功能。它负责加载 Bean 的定义,并在需要时创建和管理 Bean。BeanFactory
是 Spring 的基础 IoC 容器,适合在资源有限的环境中使用,如 Applet 或移动设备等。ApplicationContext
:这是 BeanFactory
的子接口,提供了更多高级的功能,如事件传播、资源加载、国际化等。ApplicationContext
是实际开发中更常用的 IoC 容器实现,它提供了更强大的功能和更方便的编程接口。依赖注入是 IoC 的实现方式之一,它允许将对象的依赖关系在运行时由 IoC 容器注入到对象中,而不是由对象自己创建或查找依赖对象。Spring 支持多种依赖注入的方式,包括构造方法注入、设值方法注入和字段注入。
通过构造方法来注入依赖对象。在配置文件中指定 Bean 的构造方法参数,Spring 会在创建 Bean 时调用该构造方法并注入依赖。
示例代码 :
public class Car {
private Engine engine;
// 构造方法注入
public Car(Engine engine) {
this.engine = engine;
}
// 其他方法
}
XML 配置 :
<bean id="engine" class="com.example.Engine">bean>
<bean id="car" class="com.example.Car">
<constructor-arg ref="engine">constructor-arg>
bean>
通过 setter 方法来注入依赖对象。在配置文件中指定 Bean 的属性和对应的值,Spring 会调用相应的 setter 方法来设置属性值。
示例代码 :
public class Car {
private Engine engine;
// 设值方法注入
public void setEngine(Engine engine) {
this.engine = engine;
}
// 其他方法
}
XML 配置 :
<bean id="engine" class="com.example.Engine">bean>
<bean id="car" class="com.example.Car">
<property name="engine" ref="engine">property>
bean>
直接在字段上使用注解来注入依赖对象。这种方式不需要编写 setter 方法,依赖关系直接通过字段注解来指定。
示例代码 :
public class Car {
// 字段注入
@Autowired
private Engine engine;
// 其他方法
}
Bean 是 Spring IoC 容器中管理的对象。开发者可以通过配置文件或注解来定义 Bean 的各种属性和依赖关系。
在 XML 配置文件中,使用
标签来定义 Bean。在注解配置中,使用 @Component
、@Service
、@Repository
、@Controller
等注解来标记类为 Spring 管理的 Bean。
XML 配置示例 :
<bean id="car" class="com.example.Car">bean>
注解配置示例 :
@Component
public class Car {
// 类内容
}
Spring 提供了多种 Bean 的作用域,包括 singleton、prototype、request、session、globalsession 等。默认情况下,Spring Bean 的作用域是 singleton,即每个 IoC 容器中只有一个 Bean 实例。
示例代码 :
// 设置 Bean 的作用域为 singleton
@Component
@Scope("singleton")
public class Car {
// 类内容
}
可以通过配置初始化方法和销毁方法来指定 Bean 的生命周期回调。在 Bean 创建完成后,Spring 会调用初始化方法;在 Bean 销毁之前,Spring 会调用销毁方法。
示例代码 :
public class Car {
public void init() {
// 初始化操作
}
public void destroy() {
// 销毁操作
}
}
XML 配置 :
<bean id="car" class="com.example.Car" init-method="init" destroy-method="destroy">bean>
从 Spring 2.5 开始,引入了基于注解的配置方式,使得配置更加简洁和直观。常用的注解包括 @Component
、@Service
、@Repository
、@Controller
等,用于标记类为 Spring 管理的 Bean;@Autowired
用于自动注入依赖;@Qualifier
用于指定注入的具体 Bean;@Configuration
和 @Bean
用于定义配置类和 Bean 定义。
@Component
及其派生注解@Component
是一个通用的注解,用于标记一个类为 Spring 管理的 Bean。@Service
、@Repository
、@Controller
等是 @Component
的派生注解,分别用于标记服务层、数据访问层和控制层的 Bean。
示例代码 :
@Component
public class Car {
// 类内容
}
@Service
public class UserService {
// 类内容
}
@Repository
public class UserRepository {
// 类内容
}
@Controller
public class UserController {
// 类内容
}
@Autowired
@Autowired
用于自动注入依赖。Spring 会自动查找匹配的 Bean 并注入到指定的字段、构造方法或 setter 方法中。
示例代码 :
public class Car {
@Autowired
private Engine engine;
// 其他方法
}
@Qualifier
@Qualifier
用于指定注入的具体 Bean,当存在多个同类型的 Bean 时,可以通过 @Qualifier
来指定注入哪一个 Bean。
示例代码 :
public class Car {
@Autowired
@Qualifier("petrolEngine")
private Engine engine;
// 其他方法
}
XML 配置 :
<bean id="petrolEngine" class="com.example.PetrolEngine">bean>
<bean id="dieselEngine" class="com.example.DieselEngine">bean>
@Configuration
和 @Bean
@Configuration
用于标记一个配置类,@Bean
用于在配置类的方法上定义 Bean。
示例代码 :
@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car();
}
@Bean
public Engine engine() {
return new Engine();
}
}
Spring 还支持使用 Java 配置类来替代 XML 配置文件。通过在配置类上使用 @Configuration
注解,并使用 @Bean
注解在方法上定义 Bean,可以实现与 XML 配置相同的功能。
示例代码 :
@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car();
}
@Bean
public Engine engine() {
return new Engine();
}
}
IoC 容器与依赖注入是 Spring 框架的核心特性之一,通过将对象的创建和管理交给 IoC 容器,可以实现代码的松耦合,提高代码的可测试性和可维护性。在实际开发中,可以根据项目的需求灵活选择 XML 配置、注解配置或 Java 配置的方式来定义 Bean 和管理依赖关系。掌握 IoC 容器与依赖注入的使用方法,是深入学习 Spring 框架和构建高质量 Spring 应用的基础。