【问题标题】:Spring : injecting data object in serviceSpring:在服务中注入数据对象
【发布时间】: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


【解决方案1】:

Spring 的主要特点是依赖注入。

依赖或耦合,一个对象所处的状态 使用另一个对象的功能

很明显,User 实体在您的情况下不是依赖项,因此使用 new 运算符创建它是最正确的方法。


另外,您说您希望每次引用您的服务时都创建“依赖项”。这是您在面试中可能遇到的“如何在单例中更新原型 bean”问题。这不在你的问题范围内,但我强烈建议你谷歌一下。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2015-12-10
    • 2014-01-27
    • 1970-01-01
    • 2016-05-17
    • 2014-02-21
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多