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

Если я использую базовый класс контроллеров в 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;
    }

}

Контроллер A:

@Controller
public class ControllerA extends BaseController
{


}

Контроллер B:

@Controller
public class ControllerB extends BaseController
{


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

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

  3. Если экземпляр регистратора, определенный в BaseController, используется в ControllerA или ControllerB, обязательно ли он ссылается на экземпляр, определенный для BaseController, из-за этого:

LoggerFactory.getLogger (BaseController.class)

1 Ответ

2 голосов
/ 19 мая 2011

Статика не наследуется (хотя иногда так и кажется) и не инициализируется (повторно) для подклассов.Сделайте эти поля экземпляра (а также сделайте их protected вместо private, если вы хотите получить к ним доступ в подклассах):

protected final Logger log = LoggerFactory.getLogger( getClass() );
protected final Map<String, String> NameValueMap = Common.getNameValueMap();

Таким образом, каждый подкласс будет иметь экземпляр этих полей и будеттакже сможете получить к нему доступ (обратите внимание, что для создания экземпляра Logger вы теперь можете использовать getClass(), который является методом экземпляра, и каждый подкласс предоставит свой собственный Class объект).

Что касается@Autowired вопрос, общий ответ таков: аннотация применяется к подклассам, если она аннотируется (мета) аннотацией @Inherited.@Autowired нет, насколько я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...