【问题标题】:Why Private Constructor works but Private Setter does not in SPRING DI IOC为什么 Private Constructor 有效但 Private Setter 在 SPRING DI IOC 中不起作用
【发布时间】:2017-03-05 10:42:36
【问题描述】:
public class PrefixGenerator implements Generator {

    private String customDependency;

    private PrefixGenerator() {
        System.out.println("PrefixGenerator Instantiated");
    }

    private PrefixGenerator(int status) {
        System.out.println("PrefixGenerator with int arg Instantiated");
    }

    private void setCustomDependency(String customDependency) {
        this.customDependency = customDependency;
    }
}

以下 Xml 配置有效

<bean id="bean1" class="com.hike.pojo.PrefixGenerator">
<constructor-arg name="status" value="0"></constructor-arg>
</bean>

以下 XML 配置不起作用

<bean id="bean2" class="com.hike.pojo.PrefixGenerator">
<property name="customDependency" value="Hmm"></property>
</bean>

我知道,我们可以使用反射来更改私有访问说明符。
我的问题是为什么 Spring 如此设计,如果构造函数是私有的,那么 Spring DI 可以工作 但如果 Setter 方法是私有的,则 Spring DI 不起作用。
Spring Designers 在这个设计背后的可能动机是什么?
当他们允许私有构造函数时,为什么他们不能允许私有 Setter?

【问题讨论】:

  • 构造函数首先不应该是私有的。然而,私人二传手绝对没有意义。它们将被简单地视为私有方法。
  • @c650 为什么构造函数不应该是私有的?
  • @Kayaman 因为创建实例的人应该有权访问构造函数。在一般情况下,你的构造函数不应该是私有的,除非你的类是私有的。
  • @c650 这根本不是真的。虽然通常你有非私有构造函数,例如所有具有工厂方法的类通常都有一个私有构造函数(或至少一个非公共构造函数)。
  • Spring 遵循 Java Beans 规范来访问属性,该规范要求 get/set 为 public 才能拥有一个属性(它甚至使用底层 JDK 实现!)。没有它,它就不是财产。对于构造函数,spring 需要能够构造一个 bean,而不管它来自哪里或它的访问级别是什么。

标签: java spring dependency-injection inversion-of-control spring-bean


【解决方案1】:

Spring 不需要知道您的私有数据成员,这就是不支持私有 setter 的原因。

现在进入私有构造函数,正如您所说,它遵循单例设计模式。为了支持这个 spring 允许你创建单例 bean。

Spring 完全基于反射。它遵循所有设计原则,并赋予开发者权力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2020-02-28
    • 2018-09-10
    相关资源
    最近更新 更多