【发布时间】:2018-08-18 15:54:09
【问题描述】:
由于 JPA 和 Spring 的上下文管理不同,不建议创建同时注解 @Component 和 @Entity 的数据对象类。
但是没有@Component 数据对象不能被@Autowired 注入到服务中。
但是用 new 创建我的数据对象的新实例对我来说似乎是一种回归。
有没有在 Spring 托管服务中注入数据对象 (@Entity) 的好方法?
数据对象:
@Component
@Entity
@Table(name = "user")
public class UserDo {
//data object stuff ...
服务:
@Service("listAllGoods")
@Transactional(propagation = Propagation.REQUIRED)
public class ListAllGoods implements IListGoodService{
@Autowired
private IGoodDao goodDao;
@Autowired
private UserDo user;
//option 1 : works but not recommended because forces @Component on data object
@Override
public List<GoodDo> createGood() {
user.setName("Roger");
return goodDao.create(user);
}
//option 2 :
// without @Autowired UserDo
// regression feeling
@Override
public List<GoodDO> createGood() {
UserDo user = new UserDo();
user.setName("Roger");
return goodDao.create(user);
}
【问题讨论】:
-
一般来说,将数据对象作为 bean 引入是一种不好的做法。考虑将@Component/@Repository/@Service 仅用于执行工作单元的功能组件。
-
每次引用该字段时都需要新的用户对象吗?另外,请将您的代码翻译成英文。
-
已翻译。 @Maxim Manco:我完全同意,但这就是重点。但是我需要创建一个实体对象来持久化服务。我只是想避免使用 new。
-
您认为回归是正确的做法:每次创建用户时,根据定义,您都需要一个新用户。与您之前“创建”(或者更确切地说,修改)的那个不同。你认为行得通的根本行不通。连续调用 createGood() 两次,您仍然只有一个 UserDo。依赖注入根本不是关于避免使用新的。这是关于注入功能依赖以使代码可测试(并使用 AOP 等)。
-
@Artem Malchenko 每次调用服务时我都需要新的用户实例。
标签: java spring spring-mvc jpa entity