【问题标题】:checking for null @autowired field, and initialize it manually [duplicate]检查空@autowired字段,并手动初始化它[重复]
【发布时间】:2018-05-10 16:59:39
【问题描述】:

在我的项目中,我有两个 servlet 和两个 servlet 的公共数据源。 第一个 servlet 是 mvc,第二个是 JAXWS。 对于 @Autowired 字段,第二个 servlet 始终为空。 我检查此字段是否为空的决定是这样的:

public class InRequestServiceImpl implements InRequestService {

    @Autowired
    public InRequestDao inRequestDao;// = new InRequestDaoImpl();


    public InRequestServiceImpl() {
        if (inRequestDao == null) inRequestDao = new InRequestDaoImpl();
    }

    @Override
    @Transactional
    public void insertData(InRequest doc) throws IOException {
        inRequestDao.insertData(doc);
    }
...
}

参考问题:SPRING: visibility of autowired beans in services

问题是:这种情况有没有好的做法? 帮助编写干净的代码。

【问题讨论】:

  • 没有。通常自动连线应该始终存在。你是如何配置它们的?
  • 我更喜欢这样的构造函数注入:@Autowired public InRequestServiceImpl(InRequestDao inRequestDao) { this.inRequestDao = inRequestDao; }
  • @DavidPérezCabrera 这可能会导致同样的问题,因为他的自动装配字段为空:)
  • @Stultuske 你是对的,但我在考虑单元测试。
  • 不,不是。 @Autowired 字段永远不会是 null 如果它们是这意味着这些是不由 Spring 管理的 bean 实例。你提到 servlet 的事实让我觉得你有经典的 servlet,由 servlet 容器管理,并期望 spring 神奇地向它们注入依赖项。

标签: java spring servlets autowired


【解决方案1】:

问题是:这种情况有好的做法吗?

不,没有。在 90% 的情况下,如果您没有“初始化”自动装配字段,则通常意味着您的类不受依赖注入框架(在这种情况下为 spring)管理。我建议您检查您的弹簧配置。 例如:您是否使用@Service 注释对服务类进行了注释? 除了看看here 它可能会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多