1. Spring IoC 容器核心原理解析
Spring IoC(Inversion of Control)容器是Spring框架的核心基础,它通过控制反转机制管理应用程序中的对象生命周期和依赖关系。理解IoC容器的工作原理对于掌握Spring框架至关重要。
1.1 IoC 容器的基本概念
IoC容器本质上是一个对象工厂,负责创建、配置和管理应用程序中的对象(称为beans)。与传统编程方式不同,IoC将对象的创建和依赖注入的控制权从应用程序代码转移到了容器中。
提示:可以把IoC容器想象成一个智能的对象管家,你只需要告诉它需要什么对象(通过配置或注解),它就会在适当的时候创建并装配好这些对象。
IoC容器的主要职责包括:
- 实例化应用程序类
- 配置对象
- 组装对象之间的依赖关系
1.2 BeanFactory 与 ApplicationContext
Spring提供了两种类型的IoC容器实现:
- BeanFactory:基础容器接口,提供基本的DI支持
- ApplicationContext:BeanFactory的子接口,添加了更多企业级功能
1.2.1 BeanFactory 核心功能
BeanFactory是Spring框架最基础的容器接口,主要提供以下能力:
- Bean的定义注册
- Bean的实例化和生命周期管理
- 依赖解析和注入
- Bean的检索
java复制// 基本BeanFactory使用示例
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));
MyService myService = factory.getBean(MyService.class);
1.2.2 ApplicationContext 增强功能
ApplicationContext在BeanFactory基础上增加了:
- 更便捷的AOP集成
- 消息资源处理(国际化)
- 事件发布
- 应用层特定的上下文(如WebApplicationContext)
java复制// ApplicationContext典型使用方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = context.getBean(MyService.class);
1.3 IoC 容器的工作流程
Spring IoC容器的工作流程可以分为以下几个阶段:
- 配置元数据读取:容器读取配置信息(XML、注解或Java配置)
- Bean定义解析:将配置转换为BeanDefinition对象
- Bean定义注册:将BeanDefinition注册到容器中
- Bean实例化:根据请求或配置创建Bean实例
- 依赖注入:解析并注入Bean的依赖
- 初始化:执行初始化回调
- 使用:应用程序使用完全配置好的Bean
- 销毁:容器关闭时执行销毁回调
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Bean 的存储与管理
Spring提供了多种方式将Bean注册到容器中,主要包括类注解和方法注解两种类型。
2.1 类注解方式
Spring框架为不同层次的组件提供了专门的注解:
2.1.1 @Controller - 控制层组件
@Controller注解用于标记控制层组件,通常用于MVC模式中的控制器。
java复制@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public String listUsers(Model model) {
model.addAttribute("users", userService.findAll());
return "users/list";
}
}
2.1.2 @Service - 业务逻辑层组件
@Service注解用于标记业务逻辑层组件,包含业务规则和逻辑。
java复制@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> findAll() {
return userRepository.findAll();
}
}
2.1.3 @Repository - 数据访问层组件
@Repository注解用于标记数据访问层组件,通常与数据库交互。
java复制@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<User> findAll() {
return jdbcTemplate.query("SELECT * FROM users",
(rs, rowNum) -> new User(rs
