1、操作字节码
比如 AspectJ
2、用动态派生的类替换基类
比如 Spring AOP,Hibernate的Lazy Loading
后者能够达到的能力基本上已经被利用尽了。我感觉,要想突围,不妨就像AspectJ一样,走到字节码这个层面去。由于robbin给的挑战题目是去Active Record相关的,大家对于RoR的很多热情也投注在Active Record上,那我就从Hibernate用法简化入手吧。现在没有实现所有的功能,但是可以给大家看一个样子:
Hibernate配置文件,放在classpath根目录下
Hibernate.properties
connection.driver_class=org.hsqldb.jdbcDriver connection.url=jdbc:hsqldb:mem:spike dialect=org.hibernate.dialect.HSQLDialect
User.java
public class User extends Entity{ public String username; public String password; }
业务类
Authentication.java
@Reborn public class Authentication { public static void register(String username, String password) { User user = new User(); user.username = username; user.password = password; user.save(); } public static boolean login(String username, String password) { User user = new User(); return user.find(user.username == username, user.password == password).size() > 0; } }
演示代码
RebornDemo.java
public class RebornDemo { private void demo() { System.out.println(Authentication.login("taowen", "password")); Authentication.register("taowen", "password"); System.out.println(Authentication.login("taowen", "password")); } public static void main(String[] args) throws IOException { new RebornDemo().demo(); } }
恩,这就是所有的代码了。能够想到的在语法上更进一步的就是把extends Entity变成implements Entity,但是这样的化必须用User.create() 来替换new User()了。
简化的地方:
1、Id字段自动插入
2、Entity自动标识
3、自动添加annotatedClass
4、hbm2ddl.auto缺省为create
5、hibernate.properties的每行自动添加hibernate.前缀
6、利用强类型的查询语法糖(user.username=="taowen")来代替基于字符串的HSQL
代价:
1、使用了强类型的查询语法糖的类要标记为reborn
2、在User和Entity之间使用了extends的关系