如果我在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
中定义?
如果在ControllerA
或ControllerB
中使用BaseController中定义的记录器实例,则必然会引用为BaseController
定义的记录器实例,因为:
LoggerFactory.getLogger(BaseController.class)
答案 0 :(得分:2)
静态不是继承的(尽管有时似乎是这样),并且它没有(重新)初始化为子类。制作这些实例字段(如果要在子类中访问它们,还要使它们protected
而不是private
:
protected final Logger log = LoggerFactory.getLogger( getClass() );
protected final Map<String, String> NameValueMap = Common.getNameValueMap();
这样,每个子类都将拥有这些字段的实例,并且也能够访问它(请注意,对于Logger实例化,您现在可以使用getClass()
,这是一个实例方法和每个子类将提供自己的Class
对象。
对于@Autowired
问题,一般的答案是,如果注释使用(meta)注释@Inherited
注释,则注释适用于子类。据我所知,@Autowired
不是。{/ p>