如果我在 Spring MVC 中使用基 Controller 类,定义为子类的 Controller 是否会获得基 Controller 中定义的任何私有(private)静态对象的单独实例?
例如:
基础 Controller :
@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;
}
}
Controller A:
@Controller
public class ControllerA extends BaseController
{
}
Controller B:
@Controller
public class ControllerB extends BaseController
{
}
执行
ControllerA
和ControllerB
每个都有一个单独的NameValueMap
实例?@Autowired userService
在基本 Controller 中定义意味着这不需要在ControllerA
中定义和ControllerB
?如果在 BaseController 中定义的记录器实例用于
ControllerA
或ControllerB
它一定是指为BaseController
定义的那个吗?因为这个:
LoggerFactory.getLogger(BaseController.class)
最佳答案
Static 不会被继承(虽然有时看起来是这样),并且它不会为子类(重新)初始化。制作这些实例字段(如果您想在子类中访问它们,还可以将它们设为 protected
而不是 private
):
protected final Logger log = LoggerFactory.getLogger( getClass() );
protected final Map<String, String> NameValueMap = Common.getNameValueMap();
这样,每个子类都将拥有这些字段的一个实例,并且也能够访问它(请注意,对于 Logger 实例化,您现在可以使用 getClass()
,这是一个实例方法和每个子类都将提供自己的 Class
对象)。
至于@Autowired
问题,一般的答案是,如果注释本身使用(元)注释@Inherited
进行注释,则该注释适用于子类。据我所知,@Autowired
不是。
关于java - 关于在使用 Controller 基类时继承如何影响 Spring Controller 类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051348/