我有 JSF、Spring 和 Mybatis 的 webapp。这些框架分别用于控制器、业务和 dao 层。在我的 DAO 层中,我有 CRUD 操作的方法。现在,在我的控制器层中,我需要使用插入操作。为此,我可以使用以下配置:
控制器层
我正在使用带有注释的 JSF
@ManagedBean
public class Controller{
@ManagedProperty("#{business}")
private Business business;
public void insert(){
business.insert();
}
}
业务层
我正在使用带有注释的 Spring
public interface Business{
public void insert();
}
@Service("business")
public class BusinessImpl implements Business{
@Autowired
private DaoMapper mapper;
@Override
@Transactional
public void insert(){
mapper.insert();
}
}
DAO层
我正在使用 Mybatis(mybatis-spring 库)
public interface DaoMapper{
public void insert();
}
但是在这种情况下,我的业务层只调用 DAO 层而没有实现任何其他操作,我会考虑使用这个配置:
控制器层
@ManagedBean
public class Controller{
@ManagedProperty("#{daoMapper}")
private DaoMapper mapper;
public void insert(){
mapper.insert();
}
}
DAO层
public interface DaoMapper{
@Transactional
public void insert();
}
我已经测试过并且工作正常,但我想知道我是否遇到了不好的做法
[编辑]
实际上 DaoMapper 接口是一个 MyBatis 类映射器,它关联到 XML 文件(Look)。我不知道这是否是一个 DAO 类。我想我实际上应该称它为Persisence Layer或Mapper Layer
资料来源: http: //www.infoq.com/articles/ddd-in-practice
如你看到的。表示层,在我的例子中是控制器层(我想我又犯了一个错误命名),直接调用到 DTO(或者这就是我的理解)
如果在我的控制器或表示层(无论你怎么称呼它)我需要使用插入或更新操作,我可以直接从映射器类调用,或者我必须为从此类调用映射器类新创建一个业务类
现在。如果可以使用此配置,我有疑问:
假设在我的业务类的方法中我需要调用插入操作。这就像:
@Service("business")
public class BusinessImpl implements Business{
@Autowired
private DaoMapper mapper;
@Override
@Transactional
public void insert(){
mapper.insert();
}
}
但是来自 DaoMapper 接口的方法insert已经有@Transactional注释。方法insert将受到@Transactional注释的两次影响。这不会是个问题吗?