Spring IoC(控制反轉)是Spring框架的核心機制,其原理是通過容器管理對象生命周期和依賴關系,實現解耦。
1. 控制反轉(IoC)核心思想
- 傳統模式:對象主動創建依賴(如
new Service()
),導致高耦合。 - IoC模式:將對象創建和依賴注入的控制權交給容器,開發者只需聲明依賴關系。
- 數學描述:設對象集合為O={o1,o2,…,on}O = \{o_1, o_2, \dots, o_n\}O={o1?,o2?,…,on?},依賴關系為有向圖G=(O,E)G = (O, E)G=(O,E),容器通過拓撲排序解析依賴。
2. 容器實現機制
- BeanFactory:基礎容器接口,提供
getBean()
方法獲取對象實例。 - ApplicationContext:擴展容器,支持事件發布、國際化等高級功能。
- 工作流程:
3. 依賴注入(DI)方式
- 構造器注入:通過構造函數傳遞依賴
public class UserService {private final UserDao userDao;// 容器自動注入public UserService(UserDao userDao) {this.userDao = userDao;} }
- Setter注入:通過setter方法賦值
public class OrderService {private PaymentService paymentService;// 容器調用setterpublic void setPaymentService(PaymentService ps) {this.paymentService = ps;} }
- 字段注入:通過
@Autowired
直接注入字段(需謹慎使用)
4. 生命周期管理
容器管理的Bean生命周期:
實例化 → 屬性填充 → BeanNameAware → BeanFactoryAware →
PreInitialization → @PostConstruct → InitializingBean →
自定義init → PostInitialization → 使用期 → @PreDestroy →
DisposableBean → 自定義destroy
5. 配置元數據
- XML配置:傳統方式,顯式定義Bean
<bean id="userDao" class="com.dao.UserDaoImpl"/> <bean id="userService" class="com.service.UserService"><constructor-arg ref="userDao"/> </bean>
- 注解驅動:現代主流方式
@Repository // 標識Bean public class UserDaoImpl {}@Service public class UserService {@Autowired // 自動注入private UserDao userDao; }
- Java配置:通過
@Configuration
類@Configuration public class AppConfig {@Beanpublic UserDao userDao() {return new UserDaoImpl();} }
關鍵優勢
- 解耦:對象不關心依賴創建,只需聲明接口
- 可測試性:依賴可替換為Mock對象
- 靈活性:通過配置切換實現類(如
DataSource
切換) - 維護性:依賴關系集中管理,避免散落在代碼中
典型應用場景:當需要將
MySQLRepository
替換為MongoRepository
時,只需修改配置,無需改動業務代碼,體現了IoC的核心價值——將變化隔離在配置層。