Почему частный конструктор работает, но частный сеттер не работает в SPRING DI IOC

#java #spring #dependency-injection #inversion-of-control #spring-bean

#java #spring #внедрение зависимостей #инверсия управления #spring-bean

Вопрос:

 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 config не работает

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

Я знаю, мы можем изменить спецификатор частного доступа, используя отражение.
Мой вопрос в том, почему Spring Так спроектирован, что Если конструктор является частным, Spring DI работает
но если метод Setter является частным, Spring DI не работает.

Что может быть возможным мотивом разработчиков Spring для этого дизайна?

Почему они не могли разрешить частные сеттеры, когда они разрешили частный конструктор?

Комментарии:

1. Конструкторы не должны быть частными в первую очередь. Однако частные сеттеры не имеют абсолютно никакого смысла. Они будут рассматриваться просто как частные методы.

2. @c650 Почему конструкторы не должны быть частными?

3. @Kayaman Потому что тот, кто создает экземпляр, должен иметь доступ к конструктору. В общем случае ваши конструкторы не должны быть private, если ваш класс не является.

4. @c650 Это совсем не так. Хотя обычно у вас есть непубличные конструкторы, например, все классы с фабричными методами обычно имеют частный конструктор (или, по крайней мере, непубличный).

5. Spring следует спецификациям Java Beans для доступа к свойствам, эта спецификация требует, чтобы get / set public имел свойство (для этого даже используется базовая реализация JDK!). Без этого это не свойство. Для конструктора spring должна иметь возможность создавать компонент независимо от того, откуда он берется или каков его уровень доступа.

Ответ №1:

Spring не нужно знать о вашем частном элементе данных, вот почему частные установщики не поддерживаются.

Теперь перейдем к частному конструктору, как вы сказали, он следует шаблонам проектирования singleton. Для поддержки этого spring позволяет создавать одноэлементные компоненты.

Spring полностью основан на отражении. Он следует всем принципам проектирования и предоставляет полномочия разработчику.