论坛首页 Java企业应用论坛

简单,易于Mock,仅依赖Spring的Domain Model

浏览 31110 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-05-17  
Feiing 写道
partech 算是忠实的 aspectj fans 了

自从AspectJ的老大,跳槽到Interface21,AspectJ就只是修修补补了,希望得到的特性迟迟不来,也许是过于复杂了?我想将来的某个时候它会再火起来的,我希望是语言级的支持。
0 请登录后投票
   发表时间:2008-05-17  
有没有尝试过用 acpectj post injection 实现 rich domain object ?
0 请登录后投票
   发表时间:2008-05-17  
Feiing 写道
有没有尝试过用 acpectj post injection 实现 rich domain object ?

post inject啥?
0 请登录后投票
   发表时间:2008-05-17  
inject dao to domain object, 不也是一种 rich domain object 的实现吗 ?
0 请登录后投票
   发表时间: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);
}


0 请登录后投票
   发表时间:2008-05-17  
不错的方案,  不过思路跟 spring injection 还是挺像的
0 请登录后投票
   发表时间:2008-05-17  
Feiing 写道
不错的方案,  不过思路跟 spring injection 还是挺像的

是的,基本一样。都是找个静态变量存着。
0 请登录后投票
   发表时间: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 。我理解有问题?

2 请登录后投票
   发表时间:2008-05-17  
看来相同技术条件(限制)下,路子都有点相似。
07年中的一个小项目,用的也是类似的法子,DomainObject中的EntityManager是static的,配置Spring注入,只不过还是没有DAO,而只有JPA。
研究Spring配置,还真费了不少功夫(工厂套工厂,代理叠代理的,很容易晕,当时搞明白了,现在可是全忘了),不过后来各方面原因(非技术的),改ROR了。

0 请登录后投票
   发表时间: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管理的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics