Почему конструктор инициализированного поля экземпляра вызывается дважды при загрузке Spring?

#java #spring #spring-boot #constructor

#java #spring #spring-boot #конструктор

Вопрос:

Это упрощенная версия того, что я сделал.

Класс service (у которого нет подкласса):

 public class SomeService{

    @autowired
    SomeOtherService someOtherService;

    private final ClassA aInstance = new ClasseA(“str1“, “str2“);

    public void businessLogic(){
        // logic is here
    }
}
  

Класс поля экземпляра:

 public class ClassA{
    String p1;
    String p2;

    public ClassA(String p1, String p2){
        this.p1 = p1;
        this.p2 = p2;

        // log is here
    }
}
  

Когда я запускал приведенный выше код в тесте Junit, журнал в конструкторе был напечатан дважды. Что, возможно, вызвало это?

Кстати, контроллер, вызывающий метод экземпляра службы, является @transactional, и журнал отображается только один раз, когда я это сделал.

 public class SomeService{

    @autowired
    SomeOtherService someOtherService;

    private ClassA aInstance;

    public void businessLogic(){
         
        aInstance = new ClasseA(“str1“, “str2“);

        // logic is here
    }
}
  

Отредактировано: Основываясь на комментарии Deinum, это, вероятно, проблема, связанная с загрузкой Spring. Приветствуется любая возможная причина с четким объяснением.

Заранее благодарю вас!

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

1. Потому что у вас, вероятно, есть что-то вроде @Transactional или что-то еще, что вызовет создание прокси. Spring Boot использует прокси-серверы на основе классов, поэтому вы получаете 2 экземпляра. Когда поле не инициализировано в конструкторе, это означает, что будут созданы 2 экземпляра, когда в конструкторе создание перехватывается, и будет только 1 экземпляр.

2. Спасибо, Deinum. Да, @Transactional был применен в контроллере, вызывающем метод экземпляра службы.