java - 关于在使用 Controller 基类时继承如何影响 Spring Controller 类的问题

标签 java model-view-controller spring inheritance spring-mvc

如果我在 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
{


}
  1. 执行 ControllerAControllerB每个都有一个单独的 NameValueMap 实例?

  2. @Autowired userService在基本 Controller 中定义意味着这不需要在 ControllerA 中定义和 ControllerB ?

  3. 如果在 BaseController 中定义的记录器实例用于 ControllerAControllerB它一定是指为 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/

相关文章:

java - HttpServlet 中间类未按预期初始化

spring - 使用Idea + Gradle无法导入AspectJRT和AspectWeaver Jar

java - 使用自定义对象列表(在内部类中定义)的 Parcelable 类中的问题

javascript - 在包中运行 Javascript 和 Servlet 代码

java - 由于资源泄漏导致 java 堆空间内存不足问题

javascript - Rails 5.0 - 评论不起作用

forms - 将 ExtJS 数据保存到服务器的最标准功能是什么?

php - 如何在 Slim Framework 中使用 Laravel illuminate 的数据库

java - 如何增加 STS(Spring Tool Suite)内存大小?

JavaScript 选项 使用 Firefox 进行跨站点数据发送