#java #model-view-controller #spring #inheritance #spring-mvc
#java #модель-представление-контроллер #spring #наследование #spring-mvc
Вопрос:
Если я использую класс базового контроллера в Spring MVC, получают ли контроллеры, определенные как подклассы, отдельные экземпляры любых частных статических объектов, определенных в базовом контроллере?
Например:
BaseController:
@Controller
public class BaseController
{
private UserService userService;
private static final Logger log = LoggerFactory.getLogger(BaseController.class);
private static final Map<String, String> NameValueMap = Common.getNameValueMap();
public final UserService getUserService()
{
return userService;
}
@Autowired
public final void setUserService(UserService userService)
{
this.userService = userService;
}
}
ControllerA:
@Controller
public class ControllerA extends BaseController
{
}
ControllerB:
@Controller
public class ControllerB extends BaseController
{
}
-
У
ControllerA
иControllerB
у каждого есть отдельный экземплярNameValueMap
? -
Означает ли
@Autowired userService
, определенное в базовом контроллере, что это не обязательно определять вControllerA
иControllerB
? -
Если экземпляр logger, определенный в BaseController, используется в
ControllerA
orControllerB
, обязательно ли он ссылается на тот, который определен дляBaseController
из-за этого:
LoggerFactory.getLogger(BaseController.class )
Ответ №1:
Static не наследуется (хотя иногда так кажется), и он не (повторно) инициализируется для подклассов. Создайте эти поля экземпляра (а также создайте их protected
вместо private
, если вы хотите получить к ним доступ в подклассах):
protected final Logger log = LoggerFactory.getLogger( getClass() );
protected final Map<String, String> NameValueMap = Common.getNameValueMap();
Таким образом, каждый подкласс будет иметь экземпляр этих полей, а также сможет получить к нему доступ (обратите внимание, что для создания экземпляра Logger вы теперь можете использовать getClass()
, который является методом экземпляра, и каждый подкласс предоставит свой собственный Class
объект).
Что касается @Autowired
вопроса, общий ответ заключается в том, что аннотация применяется к подклассам, если она сама аннотируется (мета) аннотацией @Inherited
. @Autowired
насколько я знаю, нет.