当前位置: 首页 > 知识库问答 >
问题:

为什么私有构造函数有效,但专用设置器在 SPRING DI IOC 中不起作用

萧和平
2023-03-14
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在这个设计背后可能的动机是什么?
为什么他们允许私有构造器时不允许私有设置器?

共有1个答案

庾勇军
2023-03-14

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

现在来看私有构造函数,正如你所说,它遵循了单例设计模式。为了支持这个spring,您可以创建单独的beans。

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

 类似资料:
  • 问题内容: 众所周知,您可以使用类型参数在Java中创建一个通用类: 但是,您也可以使用泛型 构造函数 ,这意味着显式接收其自己的泛型类型参数的构造函数,例如: 我正在努力了解用例。这个功能让我做什么? 问题答案: 这个功能让我做什么? 它至少可以让您完成 三 件事,而这 三 件事是您无法做到的: 表达参数类型之间的关系,例如: } <撤回> 正如@Lino首先观察到的那样,它使您可以表达参数必须

  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组使用: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是using在编译模块中引发了一个异常: 如您所见,它们捕获了异常,但不必费心去处理它。 即使没有太宽泛

  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组df使用df.apply: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用df.apply(list, 1)我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是在编译模块中引发了一个异常: 如您所见,它们捕获

  • 问题内容: 从文档中学习React 并遇到以下示例: 根据Mozilla的说法,super允许您在构造函数中使用。是否有其他原因可以单独使用(我知道也可以访问父类的方法),但是使用React时,是否还有其他仅通过自身调用的用例? 问题答案: 仅在具有构造函数的React组件内部被调用。例如,以下代码不需要超级: 但是,如果我们有一个构造函数,那么它是强制性的: 之所以不能被允许之前的原因是因为未调

  • 问题内容: 由于枚举构造函数只能由其常量调用,因此为什么要允许它成为包私有的? 问题答案: 构造函数实际上不是包私有的…隐式地意味着接口方法是隐式的,即使您不添加关键字也是如此。 JLS(第8.8.3节)的相关部分规定: 如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。 如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为。 如果枚举类型(第8.9节)的构造函数声明为或

  • 下面的代码给出了一个错误SyntaxError:await仅在异步函数和顶级模块体中有效。我不知道我错过了什么。