代码之家  ›  专栏  ›  技术社区  ›  Bob Herrmann

初始化bean的最佳方法是什么?

  •  10
  • Bob Herrmann  · 技术社区  · 17 年前

    在编写一个使用构造函数建立初始状态的bean,或者使用属性和afterProperties()方法之间,有哪些折衷?

    5 回复  |  直到 17 年前
        1
  •  15
  •   lycono tddmonkey    15 年前

    我不确定是否有一种“最佳”方法来初始化bean。我认为每种方法都有优点和缺点,视情况而定,其中一种可能是合适的。这当然不是一个详尽的清单,但这里有一些事情要考虑。

    使用构造函数允许您拥有一个不可变的bean。不可变对象是好的,如果你能将它们融入你的设计中。它们不需要在线程之间进行复制、序列化访问或其他特殊处理。如果您有setter,那么您的对象不是不可变的。使用构造函数还可以确保对象正确初始化。构造函数完成后,对象是有效的。如果你的目标 要求

    另一方面,使用构造函数通常会导致伸缩问题。通常情况下,您需要许多不同的构造函数,其中大多数是另一个构造函数的超集。通常这些都是为了方便。例如:

    public class Person {
      public Person(String name) { ... }
      public Person(String name, String phone) { ... }
      public Person(String name, String phone, String email) { ... }
    }
    

    我非常喜欢的一个替代方案是JavaOne的joshbloch提出的所谓“增强”构建器模式。你可以在他的书《有效Java,第二版》中看到这一点。如果您查看模式的使用方式,它还将解决“afterProperties”方法问题。生成器模式将保证对象正确初始化。

    下面是另外一篇讨论该模式的博文: http://www.screaming-penguin.com/node/7598

    我不确定这是否符合您的spring要求,但总的来说,我非常喜欢builder。

        2
  •  3
  •   akash    9 年前

    当使用setter注入时,我更喜欢使用 @PostConstruct 注释来标识初始化方法。这涉及到与弹簧框架的耦合比弹簧框架更松 afterProperties() 你提到的方法(实际上,我认为是 afterPropertiesSet() )。另一个选项是 <bean> 要素

        3
  •  2
  •   Jaap Coomans    17 年前

    它为您节省了创建setter和/或构造函数的负担以及大量的配置。 举个小例子:

    public class MyPersonBean {
      @Autowired
      private PersonManager personManager;
    
      public void doSomething() {
        this.personManager.doSomething();
      }
    }
    

    在您的配置文件中:

    <context:annotation-config/>
    

    您可以在中找到有关自动布线的更多信息 Spring Reference Documentation

        4
  •  0
  •   MetroidFan2002    17 年前

    权衡:

    建造商: 好处: 可以非常简单,尤其是需要初始化三个或更少属性。

    缺点: 必须为几种情况创建多个构造函数 构造函数不是继承的,因此类必须调用super()并提供重复的构造函数以允许前面的行为。

    二传手: 好处: 子项继承setter,因此可以轻松重写属性以影响构造后的行为。 可以以统一的方式指定多个属性,而无需查找不同的方法签名(JavaBeans约定)

    必须为每个属性显式调用每个setter。

        5
  •  0
  •   akash    9 年前

    你也可以使用 @Resource 自动连线而不是 @Autowired @Qualifier ,但我只建议用它来描述bean的特性)。这实际上取决于您的用例,哪种方式是最好的,因此您必须根据您的情况进行评估,然后做出决定。