【问题标题】:Is it good practice to set @Autowired fields in Spring to private?将 Spring 中的 @Autowired 字段设置为私有是一种好习惯吗?
【发布时间】:2017-11-08 10:03:53
【问题描述】:

将 Spring 中的 @Autowired 字段设置为 private 是否适合 DI 提议?

我认为应该是因为没有人想直接在课堂之外访问这些字段。

但另一方面,Spring 需要访问这些。我知道当他们是私人的时候它也可以这样做,但它会造成麻烦吗?例如性能问题? (如果我在这种情况下理解得很好,Spring 使用了反射,这可能会导致性能小幅下降。)还是这无关紧要?

我在谷歌上搜索并阅读了搜索此问题答案的教程,但没有找到任何“好的”答案。

哪个是这些字段的访问修饰符的最佳选择? 您能否帮助我理解这一点或向我指出一个资源,我可以从哪里开始找到答案?

【问题讨论】:

  • 这取决于您的应用程序字段的可见性。如果用@Autowired注解是独立的?
  • “最好”的方式是通过构造函数注入使用自动装配。但最好的东西真的是固执己见。只需按照 Spring 文档告诉您的操作即可,就这么简单。 docs.spring.io/spring-boot/docs/current/reference/html/…
  • 那么使用发生 DI 的私有字段不会导致性能下降或其他问题?
  • @Gimby 我不会说它自以为是地破坏了依赖注入的想法,你完全依赖 Spring 注入到该领域,没有简单的手动方法 - 从单元测试 PoV 思考,它还掩盖了配置中的 bean 创建,例如实际需要什么。 Jurgen Holler 曾表示,如果可能的话,他将取消现场注入。你应该总是尝试构造器>设置器>字段注入。构造函数注入意味着该字段也可以成为最终的。

标签: spring autowired


【解决方案1】:

当您将对象标记为自动装配时,您是在说容器来处理该对象的值,因此您只是将其设置为可通过容器公开访问。所以它已经被定义为公共和单例:这意味着您可以将引用设置为私有,这样它就不能在类外部访问,但它的值仍然可以通过容器访问。如果您想将这些变量设置为私有,这不会伤害您,但显然这不是法律,因为它始终取决于您的需求。如果您正在观看表演,请确保私人或公共不会改变任何事情。请务必选择正确的范围(单例、原型...),这将有所帮助。 如果您需要更多信息,请阅读以下问题:

How does @autowired annotation works for a private field?

How does Spring annotation @Autowired work?

why @autowired in spring does not need setter method for private instance variable?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2012-03-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多