有关在使用基本控制器类时继承如何影响Spring Controller类的问题

时间:2011-05-18 21:39:41

标签: java model-view-controller spring inheritance 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. ControllerAControllerB每个都有NameValueMap的单独实例吗?

  2. 基本控制器中定义的@Autowired userService是否意味着不需要在ControllerAControllerB中定义?

  3. 如果在ControllerAControllerB中使用BaseController中定义的记录器实例,则必然会引用为BaseController定义的记录器实例,因为:

  4.   

    LoggerFactory.getLogger(BaseController.class)

1 个答案:

答案 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>