该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-17
Feiing 写道 partech 算是忠实的 aspectj fans 了
自从AspectJ的老大,跳槽到Interface21,AspectJ就只是修修补补了,希望得到的特性迟迟不来,也许是过于复杂了?我想将来的某个时候它会再火起来的,我希望是语言级的支持。 |
|
返回顶楼 | |
发表时间:2008-05-17
有没有尝试过用 acpectj post injection 实现 rich domain object ?
|
|
返回顶楼 | |
发表时间:2008-05-17
Feiing 写道 有没有尝试过用 acpectj post injection 实现 rich domain object ?
post inject啥? |
|
返回顶楼 | |
发表时间:2008-05-17
inject dao to domain object, 不也是一种 rich domain object 的实现吗 ?
|
|
返回顶楼 | |
发表时间:2008-05-17
Feiing 写道 inject dao to domain object, 不也是一种 rich domain object 的实现吗 ?
我前面的Finder就对应DAO啊,因为往数据库里持久的任务我们已经采用另一个Aspect集中处理了,所以这里DAO就退化为往外拿Domain对象的Finder了。 public aspect FinderInitialization { private pointcut getXXXFinder() : get(public static * IDomainObject+.*Finder); Object around() : getXXXFinder(){ Object finder = proceed(); if(finder == null) { //注入 ... finder = proceed(); } assert finder != null : thisJoinPoint.getSignature().toShortString() + " 返回 null "; return finder; } } public Employee implements IDomainObject{ public static employeeFinder; ... } //当如下调用时,employeeFinder将被方面自动注入 Employee.employeeFinder.findbyCode(employeeCode); } |
|
返回顶楼 | |
发表时间:2008-05-17
不错的方案, 不过思路跟 spring injection 还是挺像的
|
|
返回顶楼 | |
发表时间:2008-05-17
Feiing 写道 不错的方案, 不过思路跟 spring injection 还是挺像的
是的,基本一样。都是找个静态变量存着。 |
|
返回顶楼 | |
发表时间:2008-05-17
Norther 写道 jianfeng008cn 写道 Norther 写道 谢谢楼上同学的纠正,这个当然算静态property注入,但是,在bean的初始化的时候,每个bean初始化的时间是不确定的,仅spring管理的bean有依赖初始化的关系,而我们的domain model是class级别的注入,这个依赖关系,spring无法知道,而只有在这个MethodInvokingFactoryBean被spring初始化的时候才去注入,有可能这个时候,其他调用Domain Object的quartz的job已经再开始跑了,但是他们去执行一些domain object的方法时,他们都还没有被注入,所以必须要要在所有的bean初始化之前去注入,才能保证所有的spring管理的bean去调用domain object时,他们都是被注入过的。
既然你的调用是有依赖的 用spring配置了这些有依赖关系的bean 那么初始化的时候也肯定会根据这个关系生成实例,怎么会和你说的这样呢? 比方说 a 依赖于b 在实例化a的时候 发现b还没有实例化 那肯定会先去实例化b啊,即使lazy了 哪么用的时候肯定要实例化了吧 那肯定了,这是没办法的,用到的那些DAO等于都先初始化了。 在Spring中,你getBean("a"), 他会初始化a,如果a依赖b,spring就会初始化b,很明确。 但是这种情况下,你初始化一个quartz的任务,开始跑,他里面没有依赖a,只是他里面操作的领域模型Student,依赖a了,还是static的,Student不是被spring管理的,spring不会知道这个关系,它不会注入,也不会初始化a(如果他是lazy的)。 “只是他里面操作的领域模型Student,依赖a了,还是static的,Student不是被spring管理的” 你的意思是特殊情况(调用Student而不是student bean)还是普遍情况 ,如果是说Student bean 那也没道理不让spring管理啊, 看你这个方案不就是在应用启动的时候,先初始化所有的dao bean(还是归spring管理的吧?),然后在domain(如Student,不归spring管?)的class级别初始化static的dao 。我理解有问题? |
|
返回顶楼 | |
发表时间:2008-05-17
看来相同技术条件(限制)下,路子都有点相似。
07年中的一个小项目,用的也是类似的法子,DomainObject中的EntityManager是static的,配置Spring注入,只不过还是没有DAO,而只有JPA。 研究Spring配置,还真费了不少功夫(工厂套工厂,代理叠代理的,很容易晕,当时搞明白了,现在可是全忘了),不过后来各方面原因(非技术的),改ROR了。 |
|
返回顶楼 | |
发表时间:2008-05-17
jianfeng008cn 写道 Norther 写道 jianfeng008cn 写道 Norther 写道 谢谢楼上同学的纠正,这个当然算静态property注入,但是,在bean的初始化的时候,每个bean初始化的时间是不确定的,仅spring管理的bean有依赖初始化的关系,而我们的domain model是class级别的注入,这个依赖关系,spring无法知道,而只有在这个MethodInvokingFactoryBean被spring初始化的时候才去注入,有可能这个时候,其他调用Domain Object的quartz的job已经再开始跑了,但是他们去执行一些domain object的方法时,他们都还没有被注入,所以必须要要在所有的bean初始化之前去注入,才能保证所有的spring管理的bean去调用domain object时,他们都是被注入过的。
既然你的调用是有依赖的 用spring配置了这些有依赖关系的bean 那么初始化的时候也肯定会根据这个关系生成实例,怎么会和你说的这样呢? 比方说 a 依赖于b 在实例化a的时候 发现b还没有实例化 那肯定会先去实例化b啊,即使lazy了 哪么用的时候肯定要实例化了吧 那肯定了,这是没办法的,用到的那些DAO等于都先初始化了。 在Spring中,你getBean("a"), 他会初始化a,如果a依赖b,spring就会初始化b,很明确。 但是这种情况下,你初始化一个quartz的任务,开始跑,他里面没有依赖a,只是他里面操作的领域模型Student,依赖a了,还是static的,Student不是被spring管理的,spring不会知道这个关系,它不会注入,也不会初始化a(如果他是lazy的)。 “只是他里面操作的领域模型Student,依赖a了,还是static的,Student不是被spring管理的” 你的意思是特殊情况(调用Student而不是student bean)还是普遍情况 ,如果是说Student bean 那也没道理不让spring管理啊, 看你这个方案不就是在应用启动的时候,先初始化所有的dao bean(还是归spring管理的吧?),然后在domain(如Student,不归spring管?)的class级别初始化static的dao 。我理解有问题? 你理解的没任何问题,Student是不被spring管理的,而他依赖的Dao是spring管理的。 |
|
返回顶楼 | |