在傳統的 Java EE 開發中,Struts 負責控制層請求處理、數據封裝與驗證,Hibernate 則專注於持久層對象與數據庫的映射。然而,基於 MVC 的三層架構在實際開發中暴露出嚴重的耦合問題:對象創建方式硬編碼、單例與多例管理混亂、層間依賴關係複雜難維護。
以典型的 Action-Service-DAO 架構為例,Action 為多例(每次請求創建),Service 和 DAO 為單例(啟動時創建),且存在鏈式依賴:Action 依賴 Service,Service 依賴 DAO。這導致對象生命週期管理極其困難,代碼中充斥著 new 關鍵字,違反了依賴倒置原則。
Spring 通過控制反轉(IOC)將對象創建權交給容器,通過依賴注入(DI)自動處理對象間依賴關係。容器啟動時讀取配置文件(applicationContext.xml),利用反射機制實例化 Bean,並通過 setter 方法或構造器注入依賴。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="service.User"></bean>
</beans>
Spring 支持三種對象創建策略:
DI 主要通過 setter 注入實現,配置示例:
<bean id="userDao" class="cn.itcast.c_property.UserDao"/>
<bean id="userService" class="cn.itcast.c_property.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userAction" class="cn.itcast.c_property.UserAction">
<property name="userService" ref="userService"/>
</bean>
Spring AOP 將事務管理、日誌記錄、權限控制等橫切關注點封裝為切面,通過動態代理在不修改業務代碼的情況下織入目標方法。框架提供一站式解決方案,核心模塊包括:
Resource r = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(r);
User user = (User) factory.getBean("user");
掌握 Spring 核心機制,是構建高內聚、低耦合企業級應用的基石。