之前發過兩篇關於Spring的總結帖子 反響還不錯,再把剩下的幾篇發上來。共享給大家。
我對IoC/DI的理解
我對AOP的理解
1、問題
1、JDBC/ORM框架(如Hibernate)開發中編程模型有哪些缺點? 如JDBC
2、解決方案(模板設計模式,本質:將可變的和不可變的分離)
模板方法模式:定義操作的步驟(固定的),將可變的步驟交給子類處理。
public interface JdbcOperations {
//接口定義行爲集
public Object execute() throws SQLException ;
}
public abstract class AbstractJdbcOperations implements JdbcOperations {
@Override
public final Object execute() throws SQLException {
Connection conn = DataSourceUtils.getConnection();
try {
Object retVal = doInConnection(conn);
conn.commit();
return retVal;
}catch (Exception e) { conn.rollback(); throw e;}
finally { conn.close(); }
}
public abstract Object doInConnection(Connection conn) throws SQLException;
}
public class DataSourceUtils {
public static Connection getConnection() {
//返回數據庫連接
return null;
}
}
JdbcOperations select = new AbstractJdbcOperations() {
@Override
public Object doInConnection(Connection conn) throws SQLException {
PreparedStatement pstmt =
conn.prepareStatement("select * from tbl_user");
ResultSet rs = pstmt.executeQuery();
List result = null;
//處理結果集
return result;
}
};
select.execute();
缺點:不夠靈活
3、解決方案(模板設計模式+回調,本質:將可變的和不可變的分離,可變通過回調)
回調(命令):由組件定義,但不由組件調用,而是由系統調用
一般用於:可變不可變分離,未知功能。
public interface JdbcOprations2 {
//接口定義行爲集
public Object execute(ConnectionCallback callback) throws Exception ;
}
public interface ConnectionCallback {
public Object doInConnection(Connection conn) throws SQLException;
}
public class JdbcTemplate implements JdbcOprations2 {
@Override
public Object execute(ConnectionCallback callback) throws Exception {
Connection conn = DataSourceUtils.getConnection();
try {
Object retVal = callback.doInConnection(conn);
conn.commit();
return retVal;
}
catch (Exception e) {
conn.rollback();
throw e;
}
finally {
conn.close();
}
}
}
jdbcTemplate.execute(new ConnectionCallback() {
@Override
public Object doInConnection(Connection conn) throws SQLException {
//可變操作
return null;
}
});
public interface PreparedStatementCallback {
public Object doInPreparedStatement(PreparedStatement pstmt)
throws SQLException;
}
缺點:靈活但不通用
4、解決方案(Spring JDBC框架)
JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
5、異常問題
JDBC/ORM框架(如Hibernate)開發中異常處理有哪些缺點? 不一致的異常類,如JDBC是SQLException 而hibernate是HibernateException,等。
缺點:不一致的異常體系,需要了解每個框架的異常含義 ,Spring的一致的異常體系(DataAccessException)
6、DAO訪問問題
訪問JDBC和訪問Hibernate使用完全不同且根本不類似的API?
爲了便於以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate,
Spring提供了一套抽象DAO類供你擴展。
JdbcDaoSupport - JDBC數據訪問對象的基類。
需要一個DataSource,同時爲子類提供 JdbcTemplate。
HibernateDaoSupport - Hibernate數據訪問對象的基類。
需要一個SessionFactory,同時爲子類提供 HibernateTemplate。
JdoDaoSupport - JDO數據訪問對象的基類。
需要設置一個PersistenceManagerFactory, 同時爲子類提供JdoTemplate。
JpaDaoSupport - JPA數據訪問對象的基類。
需要一個EntityManagerFactory,同時 爲子類提供JpaTemplate。
一致的DAO抽象
Callback:定義可變行爲,即不可預知行爲(命令設計模式)
Template:提供模板支持,簡化開發Support:提供對Template的支持,提供一組簡便方法,並提供獲取Template的方法
相關資料