Вопросы о том, как наследование влияет на классы Spring Controller при использовании базового класса контроллера

#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
{


}
  
  1. У ControllerA и ControllerB у каждого есть отдельный экземпляр NameValueMap ?

  2. Означает ли @Autowired userService , определенное в базовом контроллере, что это не обязательно определять в ControllerA и ControllerB ?

  3. Если экземпляр logger, определенный в BaseController, используется в ControllerA or ControllerB , обязательно ли он ссылается на тот, который определен для 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 насколько я знаю, нет.