J2EE 開發日益複雜,API、編程模型與配置織成難以駕馭的網絡。為應對此挑戰,以控制反轉為核心的輕量級框架應運而生。Spring 框架正是其中翹楚,它不僅標準化了 J2EE 最佳實踐,更同質化了無處不在的 J2EE 模式,讓企業級開發回歸簡潔高效。
IoC 本質是管理類別間關聯的技術。傳統硬編碼依賴關係冗長且易錯;優秀的 IoC 框架透過XML 配置檔聲明式串聯應用程式依賴,而非程式化方式。核心原則:面向介面編程,介面實現在運行時由 IoC 配置宣告,實現「重新佈線」關聯而不動應用代碼。
假設架構師交付 UML:TemperatureSensor 委託實作 ProtocolAdapterIfc 的具體類別(如 RS232Adapter)獲取溫度值。Spring 於運行時依配置建立關聯:
<bean id="tempSensor" class="yourco.project.sensor.TemperatureSensor">
<property name="sensorDelegate">
<ref bean="sensor"/>
</property>
</bean>
<bean id="sensor" class="yourco.project.comm.RS232Adapter"/>
啟動 Spring 並獲取 Bean:
ClassPathXmlApplicationContext appContext =
new ClassPathXmlApplicationContext("simpleSensor.xml");
BeanFactory bf = (BeanFactory) appContext;
TemperatureSensor ts = (TemperatureSensor) bf.getBean("tempSensor");
System.out.println("The temp is: " + ts.getTemperature());
優於硬編碼 new TemperatureSensor().setSensorDelegate(new RS232Adapter()) 的靈活性在於:
DummyProtocolAdapter)傳統 J2EE 以 Singleton Factory 封裝 JNDI 查找,Spring 以 IoC 統一處理 EJB、POJO、Web Service 等異構服務,消除專用 Singleton 程式碼。Web 層開發者僅面向業務介面,實現細節由 Spring 配置決定。
<bean id="myBizServiceRef"
class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
<property name="jndiName"><value>myBizComponent</value></property>
<property name="businessInterface">
<value>yourco.project.biz.MyBizInterface</value>
</property>
</bean>
獲取服務:MyBizInterface myService = bf.getBean("myBizServiceRef"); Spring 動態代理隱藏 EJB 細節。若改用 POJO 或 Stub 實現,僅需修改配置:
<bean id="myBizServiceRef" class="yourco.project.biz.MyStubbedBizService"/>
客戶端代碼完全無感知,極大便利單元測試與架構演進。
傳統 JDBC 充斥著獲取連線、構造查詢、迭代結果、異常處理、關閉資源的重複代碼。Spring JdbcTemplate 封裝樣板邏輯:
DataSource ds = (DataSource) bf.getBean("myDataSource");
JdbcTemplate temp = new JdbcTemplate(ds);
List sensorList = temp.query("select sensor.type FROM sensors",
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString(1);
}
});
資料源配置靈活支援 DBCP、JNDI 等:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property>
<property name="url"><value>jdbc:mysql://romulus/sensors</value></property>
<property name="username"><value>heater</value></property>
<property name="password"><value>hotshot</value></property>
</bean>
Spring 將受檢異常(如 JDBC SQLException)映射為未受檢異常層級,簡化錯誤處理。結合 AOP 可實現異常軟化:將底層具體異常(CommChecksumFault)包裝為業務語義異常(SoftenedProtocolException)。
範例:定義簡化介面 SensorIfc(無受檢異常),編寫 MethodInterceptor 攔截 ProtocolAdapterIfc 呼叫,捕獲具體異常重拋為 RuntimeException 子類。Spring 配置串聯目標物件、攔截器與代理:
<bean id="protocolAdapter" class="yourco.project.comm.CarrierPigeon">...</bean>
<bean id="sensorInterceptor" class="yourco.project.springsupport.SensorInvocationInterceptor"/>
<bean id="temperatureSensorOne" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>yourco.project.interfaces.SensorIfc</value></property>
<property name="target"><ref local="protocolAdapter"/></property>
<property name="interceptorNames"><list><value>sensorInterceptor</value></list></property>
</bean>
應用程式僅處理單一 SoftenedProtocolException,大幅簡化異常處理邏輯。
J2EE 容器耦合導致單元測試極難。Spring 配置機制支援實現動態切換:
Spring 是強健的輕量級框架,彌補 J2EE/EJB 環境不足。其優勢在於不走極端:可從簡單依賴注入起步,漸進掌握 AOP 等進階功能。核心價值:讓開發者專注業務邏輯,而非基礎設施構建。如同購買預製餐點——決定想吃什麼,帶回家加熱即享。歡迎嘗試 Spring,體驗 J2EE 開發的輕鬆與優雅。