Spring IoC 核心概念
IoC(Inversion of Control,控制反转)是 Spring 框架的核心,通过将对象的创建和依赖管理交给容器实现解耦。核心机制是 DI(Dependency Injection,依赖注入),分为构造器注入、Setter 注入和字段注入三种方式。
依赖注入的三种方式
构造器注入
通过构造函数传递依赖对象,适合强制依赖的场景。
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Setter 注入
通过 Setter 方法注入依赖,适合可选依赖。
public class OrderService {
private PaymentService paymentService;
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
字段注入(不推荐)
直接通过 @Autowired 注解字段,代码简洁但不利于测试。
public class ProductService {
@Autowired
private InventoryService inventoryService;
}
配置 Spring IoC 容器
XML 配置方式
定义 Bean 及其依赖关系:
<bean id="userRepository" class="com.example.UserRepositoryImpl"/>
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository"/>
</bean>
Java 注解配置
使用 @Component 和 @Autowired 简化配置:
@Component
public class UserRepositoryImpl implements UserRepository {}
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Java Config 方式
通过 @Configuration 和 @Bean 显式定义 Bean:
@Configuration
public class AppConfig {
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
@Bean
public UserService userService(UserRepository userRepository) {
return new UserService(userRepository);
}
}
Bean 的作用域与生命周期
作用域类型
singleton:默认作用域,容器中仅存在一个实例。prototype:每次请求创建新实例。request/session:Web 环境下的请求或会话级别作用域。
生命周期回调
通过 @PostConstruct 和 @PreDestroy 注解管理:
@Component
public class DatabaseInitializer {
@PostConstruct
public void init() {
System.out.println("Bean 初始化完成");
}
@PreDestroy
public void cleanup() {
System.out.println("Bean 销毁前清理");
}
}
自动扫描与条件化装配
组件扫描
启用自动扫描包路径:
@Configuration
@ComponentScan("com.example")
public class AppConfig {}
条件化装配
通过 @Conditional 实现条件判断:
@Bean
@Conditional(ProdEnvironmentCondition.class)
public DataSource prodDataSource() {
return new ProductionDataSource();
}
常见问题与解决
循环依赖问题
构造器注入可能导致循环依赖,建议改用 Setter 注入或字段注入。Spring 通过三级缓存解决部分循环依赖,但需避免设计上的循环引用。
多实现类冲突
使用 @Qualifier 指定具体 Bean:
@Autowired
@Qualifier("mysqlUserRepository")
private UserRepository userRepository;
通过以上内容,可以快速掌握 Spring IoC 的基本原理与实践方法。
1092

被折叠的 条评论
为什么被折叠?



