#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 был применен в контроллере, вызывающем метод экземпляра службы.