IoC容器
IoC(Inversion of Control,控制反转)是Spring框架的核心思想,将对象的创建和管理权交给容器。
IoC概念
传统方式(手动创建)
Java
// 传统方式:手动创建对象
UserService userService = new UserService();
OrderService orderService = new OrderService(userService); // 手动传递依赖
IoC方式(容器管理)
Java
// IoC方式:容器负责创建和注入
@Service
public class OrderService {
@Autowired
private UserService userService; // 容器自动注入
}
IoC容器类型
BeanFactory(基础容器)
Java
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService userService = factory.getBean(UserService.class);
ApplicationContext(高级容器,推荐)
Java
// XML配置
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// Java配置
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Spring Boot自动创建
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Application.class, args);
}
}
两种容器对比
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| 初始化时机 | 懒加载,getBean时创建 | 预加载,启动时创建所有Bean |
| 国际化支持 | ❌ | ✅ |
| 事件机制 | ❌ | ✅ |
| AOP支持 | 需手动配置 | 自动支持 |
| 性能 | 启动快 | 启动稍慢 |
| 推荐度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
ApplicationContext实现类
| 实现类 | 配置方式 | 适用场景 |
|---|---|---|
| ClassPathXmlApplicationContext | XML文件 | 传统应用 |
| FileSystemXmlApplicationContext | XML文件路径 | 外部配置 |
| AnnotationConfigApplicationContext | Java配置 | 纯注解项目 |
| WebApplicationContext | Web应用 | Web项目 |
IoC核心功能
1. Bean管理
Java
// 获取Bean
UserService userService = context.getBean(UserService.class);
// 按名称获取
UserService userService = (UserService) context.getBean("userService");
// 按类型获取
UserService userService = context.getBean("userService", UserService.class);
// 获取所有Bean名称
String[] names = context.getBeanDefinitionNames();
2. 依赖注入
Java
@Service
public class OrderService {
@Autowired
private UserService userService; // IoC容器自动注入
}
3. 生命周期管理
Java
@Service
public class UserService {
@PostConstruct
public void init() {
System.out.println("Bean初始化");
}
@PreDestroy
public void destroy() {
System.out.println("Bean销毁");
}
}
IoC解决的问题
| 问题 | 传统方式 | IoC方式 |
|---|---|---|
| 对象创建 | 手动new | 容器负责 |
| 依赖管理 | 手动传递 | 自动注入 |
| 对象生命周期 | 手动管理 | 容器管理 |
| 对象复用 | 需自行实现 | 单例自动复用 |
要点总结
- IoC全称Inversion of Control,即控制反转
- 将对象创建和管理权交给Spring容器
- ApplicationContext是推荐的IoC容器实现
- ApplicationContext启动时预加载所有Bean
- IoC实现了对象解耦,降低了代码复杂度
📝 发现内容有误?点击此处直接编辑