При каждом запросе модели Accaunt постоянно осуществляется поиск в БД. Хочу инициализировать его всего один раз. Я правильно реализовал или нет? и будут ли ошибки при загрузке сервлетов, ведь private Accaunt accaunt не имеет @Scope.
@ControllerAdvice(basePackages = "com.work.controller.accaunt")
public class CtrAddAccaunt {
@Autowired private DaoAccaunt daoAccaunt;
private Accaunt accaunt;
@ModelAttribute(SessionAttr.ACCAUNT)
public Accaunt getAccaunt(Authentication authentication) {
System.out.println("поиск аккаунта + "+authentication.getName());
if (accaunt != null) {
return accaunt;
} else {
return daoAccaunt.getAccaunt(authentication.getName());
}
}
}
У вас private Accaunt accaunt; не используется вообще.
Полагаю, вы хотели сделать так:
@ModelAttribute(SessionAttr.ACCAUNT)
public Accaunt getAccaunt(Authentication authentication) {
System.out.println("поиск аккаунта + "+authentication.getName());
if (accaunt == null) {
account = daoAccaunt.getAccaunt(authentication.getName());
}
return account;
}
Но эта реализация сохранит account один раз - а вам нужно сохранять account для каждого authentication.getName() - использовать HashMap, например.
Не работал подробно с MVC, но, думаю, всё равно так работать не будет.
@Scope нужно указывать над классом CrtAddAccount, чтобы добиться нужного эффекта. Но могут возникнуть другие проблемы..
Лучшее решение в вашем случае - использование spring cache.
Вот пример его использования при обращении к БД
А вот краткое описание на SO
П.С. Однако необходимость использования кэширования обращения к базе возникает не часто, думаю, стоит её использовать с осторожностью и пониманием дела
Проблема оказалась в том, что @ControllerAdvice добовлял ко всем контроллерам в пакете атрибут ACCAUNT.
Нужно было просто указать не пакет, а конкретные контроллеры в переменную assignableTypes:
@ControllerAdvice(assignableTypes = {
CtrAccauntPageUser.class,
CtrAccauntPageCompany.class
})
public class CtrAdviceAccaunt {
@Autowired private DaoAccaunt daoAccaunt;
@ModelAttribute(SessionAttr.ACCAUNT)
public Accaunt getAccaunt(Authentication authentication, HttpServletRequest request) {
System.out.println("httpServletRequest + "+request.getRequestURI());
return daoAccaunt.getAccaunt(authentication.getName());
}
}
Теперь @ModelAttribute(SessionAttr.ACCAUNT) виден только в тех контроллерах, которые я указал.
Можно сделать вывод, что:
@ModelAttribute во все контроллеры находящиеся в данном пакете;@ModelAttribute во все контроллеры находящиеся в данном пакете;@ModelAttribute в конкретный контроллер.Сборка персонального компьютера от Artline: умный выбор для современных пользователей