首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

品味 Spring 的核心魅力:非侵入式設計、BeanWrapper 與 JDBC 範本

     編輯:Java 相關知識

Spring 框架的核心哲學在於:在不影響 Java 對象設計的前提下,將其納入框架管理。這與 EJB 的侵入式設計(強制實現特定接口、繼承特定基類)及 Avalon 等輕量級容器的「Type 1」做法形成鮮明對比。為實現這一目標,Spring 大量採用反射與內省技術,構建出動態、靈活的基礎設施。

一、Bean 管理的核心:BeanWrapper

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 工廠:Prototype 與 Singleton 的統一抽象

單個 Bean 包裝解決後,需管理多 Bean 實例。Spring 採用兩種基本創建策略:

  • Prototype:每次請求創建新實例
  • Singleton:全局共享單一實例

得益於反射技術,Spring 無需像傳統工廠模式那樣為每個類編寫工廠方法,即可靈活實例化任意類。BeanFactory 介面定義統一的 getBean() 方法,屏蔽了創建策略差異,客戶端無需關心具體是 Prototype 還是 Singleton。

三、JDBC 的優雅再封裝:解決樣板代碼與異常處理痛點

JDBC 雖封裝了底層驅動,但仍存在兩大痛點:

  1. 大量樣板代碼:獲取連接、關閉資源、事務控制重複勞動
  2. 異常資訊不足:所有錯誤統一拋出 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));
 }
 });

匿名內部類實現回調,異常處理完全由框架負責,業務代碼專注於核心邏輯。

四、層間鬆耦合:Web 層與業務層的解耦整合

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 框架的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved