【发布时间】: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