在具有丰富域模型的Web服务器项目中(应用程序逻辑在模型中,而不在服务中)如何处理将依赖项注入模型对象?你有什么经历?
你使用某种形式的AOP吗?喜欢Springs @Configurable注释?加载时间还是构建时间?你遇到的问题?
你用手动注射吗?那你如何处理不同的实例化场景(通过库创建对象[如Hibernate],用“new”创建对象……)?
或者您是否使用其他方式注入依赖项?
解决方法
我们使用Spring的@Configurable(以及常规的new运算符),它就像魅力一样.没有更多
anemic domain models.最后,这是更加面向对象的设计,不是吗:
Person person = new Person(firstname,lastname); // weird peopleService.save(person); // good (save is @Transactional) person.save(); Mail mail = new Mail(to,subject,body); // weird mailService.send(mail); // good (send is @Transactional) mail.send();
我们还没有做过任何性能比较.到目前为止,我们根本没有觉得有必要这样做.
编辑:这是人类的样子:
@Configurable("person") public class Person { private IPersonDAO _personDAO; private String _firstname; private String _lastname; // SNIP: some constructors,getters and setters @Transactional(rollbackFor = DataAccessException.class) public void save() { _personDAO.save(this); } @Transactional(readOnly = true) public List<Role> searchRoles(Company company) void{ return _personDAO.searchRoles(this,company); } // it's getting more interesting for more complex methods @Transactional(rollbackFor = DataAccessException.class) public void resignAllRoles(Company company) { for (Role role : searchRoles(company)) { role.resign(); } } } // the implementation now looks like this personService.getPerson(id).resignAllRoles(company); // instead of this roleService.resignAll(personService.searchRoles(personService.getPerson(id),company));
这就是Spring配置:
<context:spring-configured /> <bean id="person" class="org.example.model.Person" lazy-init="true"> <property name="personDAO" ref="personDAO" /> </bean>
注意:如您所见,周围仍有服务,例如:搜索对象(personService.getPerson(id))但是对传递的对象(例如人)进行操作的所有方法都将移动到该类本身(即person.save()而不是personService.save(person)).该方法本身保持不变,适用于任何底层数据访问层(纯JDBC,Hibernate,JPA,……).它只是移动到它所属的地方.