springside筆記一

ttitfly發表於2007-10-19

1. dao層

以Hibernate為例

首先定義了一個類

java 程式碼
  1. public class HibernateGenericDao extends HibernateDaoSupport   

HibernateGenericDao 具有CRUD等基本功能。

又定義了一個供所有實體物件對應的Service層繼承的類:

java 程式碼
  1. HibernateEntityDao< T > extends HibernateGenericDao implements EntityDao< T >  

這裡用到了jdk5.0裡的範型,當一個實體物件對應的Service層繼承該類時,比如:

java 程式碼
  1. public class UserManager extends HibernateEntityDao < User >  
會把User這個實體物件傳遞給HibernateEntityDao.

 當UserManager被例項化時,首先會去呼叫其父類的建構函式,HibernateEntityDao的建構函式裡的程式碼如下:

java 程式碼
  1. protected Class<t></t> entityClass;// DAO所管理的Entity型別.   
  2.   
  3. /**  
  4. * 在建構函式中將泛型T.class賦給entityClass.  
  5. */  
  6. public HibernateEntityDao() {   
  7.     entityClass = GenericsUtils.getSuperClassGenricType(getClass());   
  8. }  

 

java 程式碼
  1. public static Class getSuperClassGenricType(Class clazz) {   
  2.         return getSuperClassGenricType(clazz, 0);   
  3.     }  
java 程式碼
  1. public static Class getSuperClassGenricType(Class clazz, int index) {   
  2.   
  3.         //返回表示此 Class 所表示的實體的直接超類的 Type,也就是extends的類。不包含implements的   
  4.         //Type是Class的父類   
  5.         Type genType = clazz.getGenericSuperclass();   
  6.   
  7.         if (!(genType instanceof ParameterizedType)) {   
  8.             log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");   
  9.             return Object.class;   
  10.         }   
  11.         //返回表示此型別實際型別引數的 Type 物件的陣列,陣列裡放的都是對應型別的Class   
  12.         Type[] params = ((ParameterizedType) genType).getActualTypeArguments();   
  13.   
  14.         if (index >= params.length || index < 0) {   
  15.             log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "  
  16.                     + params.length);   
  17.             return Object.class;   
  18.         }   
  19.         if (!(params[index] instanceof Class)) {   
  20.             log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");   
  21.             return Object.class;   
  22.         }   
  23.         return (Class) params[index];   
  24.     }  
可以看到在HibernateEntityDao的建構函式裡例項化了entityClass,得到了具體是哪個實體類對應的service層(Manager) 繼承的這個HibernateEntityDao. 也就是具體的某個實體類的Class,在這裡是User.class,HibernateEntityDao裡對資料庫的操作,用的都是entityClass,這樣一來也就是操作這個實體對應的表了。CRUD基本的操作都可以不用寫了。

相關文章