Spring IoC 教程

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 的基本原理与实践方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值