Создайте bean-компонент с помощью applicationContext, вызывающего конструктор noArgs, даже после передачи аргументов в Spring-загрузке - PullRequest
0 голосов
/ 22 января 2020

У меня есть класс без конструктора args и конструктор с аргументами, как показано ниже.

@Component
public class DataValidator  {
    private DataValidator(){
        System.out.println("Calling no Args const");
    } 


    public DataValidator(String id){
        log.info("ID is: "+id);
    }

}

StartValidator. java

@Component 
public class StartValidations extends BaseValidator {


    public void start() {
       DataValidator data = applicationContext.getBean(DataValidator.class,"123");
    }
}

Когда я вызываю функцию start(), он печатает Calling no Args const вместо ID is: 123. Почему он вызывает конструктор no args даже после передачи аргументов методу getBean.

Ответы [ 3 ]

1 голос
/ 22 января 2020

Я думаю, что в вашем случае в классе DataValidator, так как было указано несколько конструкторов, и ни один из них не был отмечен @Autowired(required=true). Поэтому Spring использовал конструктор по умолчанию для создания Бина. В результате при вызове

applicationContext.getBean(DataValidator.class,"123");

вы получаете компонент, созданный с помощью конструктора по умолчанию.

Только один аннотированный конструктор на класс может быть помечен как требуется, но несколько не Необходимые конструкторы могут быть аннотированы. В этом случае каждый рассматривается среди кандидатов, и Spring использует самый жадный конструктор, зависимости которого могут быть удовлетворены

1 голос
/ 22 января 2020

Используйте @Scope ("prototype") над классом DataValidator. Это позволяет определить одно определение компонента для любого количества экземпляров объекта.

Найти ссылку здесь https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Scope.html

@Component
@Scope("prototype")
public class DataValidator  {
    private DataValidator(){
        System.out.println("Calling no Args const");
    }
    public DataValidator(String id){
        log.info("ID is: "+id);
    }
}
1 голос
/ 22 января 2020

Насколько я знаю, всякий раз, когда вы объявляете компонент, компонент создается с использованием одного конструктора для автопроводки (единственный доступный конструктор или выбирает один после сравнения доступных конструкторов). Я бы посоветовал

1) использовать вместо этого сеттер

2) удалить @Component и полагаться только на вашу конфигурацию

3) место @Value("${placeholder}") перед String id в вашем bean-компоненте, и отметьте этот конструктор для автоматического подключения, так как он выбран.

Кроме того, проверьте связанный вопрос

...