Spring 框架的核心哲學在於:在不影響 Java 對象設計的前提下,將其納入框架管理。這與 EJB 的侵入式設計(強制實現特定接口、繼承特定基類)及 Avalon 等輕量級容器的「Type 1」做法形成鮮明對比。為實現這一目標,Spring 大量採用反射與內省技術,構建出動態、靈活的基礎設施。
IoC 要求 Bean 之間不直接調用,而是以被動協作方式運作,因此 Bean 管理成為 Spring 的核心。org.springframework.beans 包中的 BeanWrapper 是這一機制的關鍵實現——它是 Bean 的包裝器,統一處理屬性設置(含巢狀屬性)與方法調用。
定義兩個簡單 Bean:
public class Company {
private String name;
private Employee managingDirector;
// getter/setter 省略
}
public class Employee {
private float salary;
// getter/setter 省略
}
使用 BeanWrapper 統一操作:
Company c = new Company();
BeanWrapper bwComp = new BeanWrapperImpl(c);
bwComp.setPropertyValue("name", "Some Company Inc.");
// 建立關聯
Employee jim = new Employee();
BeanWrapper bwJim = new BeanWrapperImpl(jim);
bwJim.setPropertyValue("name", "Jim Stravinsky");
bwComp.setPropertyValue("managingDirector", jim);
// 存取巢狀屬性
Float salary = (Float) bwComp.getPropertyValue("managingDirector.salary");
雖代碼量稍多,但 Spring 獲得了統一、反射驅動的屬性存取能力,為後續的配置綁定、AOP 代理奠定基礎。
單個 Bean 包裝解決後,需管理多 Bean 實例。Spring 採用兩種基本創建策略:
得益於反射技術,Spring 無需像傳統工廠模式那樣為每個類編寫工廠方法,即可靈活實例化任意類。BeanFactory 介面定義統一的 getBean() 方法,屏蔽了創建策略差異,客戶端無需關心具體是 Prototype 還是 Singleton。
JDBC 雖封裝了底層驅動,但仍存在兩大痛點:
SQLException,無法區分連接故障、並發衝突、SQL 語法錯誤等根因Spring 在 org.springframework.jdbc.object 中提供模板基類,如 MappingSqlQuery,強制子類實現 mapRow(ResultSet, int) 將結果集映射為領域對象:
class UserQuery extends MappingSqlQuery {
public UserQuery(DataSource ds) {
super(ds, "SELECT * FROM PUB_USER_ADDRESS WHERE USER_ID = ?");
declareParameter(new SqlParameter(Types.NUMERIC));
compile();
}
protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
User user = new User();
user.setId(rs.getLong("USER_ID"));
user.setForename(rs.getString("FORENAME"));
return user;
}
public User findUser(long id) { return (User) findObject(id); }
}
JdbcTemplate 採用回調模式,將異常捕獲、資源釋放等通用邏輯封裝在模板父類中:
JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList();
template.query("SELECT USER.NAME FROM USER",
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
names.add(rs.getString(1));
}
});
匿名內部類實現回調,異常處理完全由框架負責,業務代碼專注於核心邏輯。
Spring 作為全棧框架,定義了 Web 層與後端業務層的連接方式,延續 MVC 思想但耦合度更低、不依賴具體整合技術。Controller 僅依賴業務介面,透過 Setter 注入獲取實現:
public class GoogleSearchController implements Controller {
private IGoogleSearchPort google;
private String googleKey;
// setter 省略
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) {
String query = req.getParameter("query");
GoogleSearchResult result = google.doGoogleSearch(googleKey, query, ...);
return new ModelAndView("googleResults", "result", result);
}
}
Web 層零依賴具體業務實現,單元測試與模組替換極為便利。
Spring 的魅力在於以非侵入式設計重塑企業級開發體驗:BeanWrapper 統一屬性存取、工廠抽象屏蔽創建細節、JDBC 模板消除樣板代碼、回調統一異常處理、Controller 與 Service 介面解耦。這些設計思想至今仍是現代 Java 框架的基石。