最近看了一些東西,隨便寫寫JFinal的一些東西吧
領域模型,domain
失血:只有get set方法
貧血:除了get set方法還可能有不涉及資料庫的邏輯,如計算邏輯等
充血:有持久層的邏輯,如User user = new User(); user各種set,最後user.save();
漲血:充血至少事務還在service層,漲血連service層都取消了。
昨天看了mockMvc的程式碼和httpClient的程式碼。發了2篇文章。
今天看了JFinal的程式碼。
我也曾經寫過一個框架。
JFinal是充血模型。
JFinal的dao和model是一個東西:
public class User extends Model<User> {
public static final User dao = new User();
}
看了JFinal的dao的find() 方法實現,發現連反射都沒有用,直接把資料庫的resultSet(結果集)放到了一個Map裡。
我以前寫的SuperDao是反射直接把實體類的屬性set進去了。
不過JFinal的實體類根本沒有field,內部是一個Map,Map的key直接是資料庫欄位。
實際上JFinal 的實體類就是一個Map,變數名是資料庫欄位,這樣造成了記憶負擔。
不過也有解決方案:
public class User extends Model<User> {
public static final User dao = new User();
private static String id = "user_id";
private static String userName = "user_name";
}
int id = user.get(User.id); //----------------------------------> get方法就是從Map中取。這應該算是一個代理模式吧。
String userName = user.get(User.userName);
JFinal的表現層框架是靠filter攔截,JFinal類有一個Handler責任鏈。
Handler是一個abstract class。
public abstract void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled);
比我當初的實現強多了,我也是一個filter,不過filter裡直接ActionMap對映到具體的Action類,直接execute了。
JFinal沒有內建的IOC,不過可以用外掛。
JFinal的事務是通過aop實現的。是Tx.class
需要aop事務增強的方法,只需要一個註解@Before(Tx.class)
沒具體看,想來有方法前aop註解@Before,就一定有方法後aop @After吧。
就寫這些吧。