javaEE Controller 的方法能不能设置成 static


javaEE Controller 的方法能不能设置成 static ,这样是不是更好


 java


 @Controller
public class IndexController {

    private static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    private static UserService userService = (UserService) ctx.getBean("userService");

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public static String index(Map<String, Object> map, HttpServletRequest request, HttpSession session) {

        Integer uid = (Integer) session.getAttribute("uid");

        User user = userService.get(uid);
        map.put("user", user);

        return "index";
    }
}

java

bagacat 9 years, 1 month ago

题主用的是SpringMVC,Spring的bean是由IOC容器管理的,所以这个问题的核心是IOC容器初始化bean,首先从SpringMVC的入口 DispatcherServlet 说起,一图胜千言:
图片描述

DispatcherServlet在初始化的时候会启动一个web容器,用户可以向这个web容器中注入相关的组件。一般而言,我们在web.xml这样配置ContextLoaderListener:


 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

这时候又会启动一个web容器,该web容器就作为父容器,而DispatcherServlet启动的容器作为子容器。
子容器管理SpringMVC的组件,如Controller,该容器即为一个IOC容器。
下面来讲讲重点,也就是IOC容器是如何初始化并管理bean的,Spring有三种初始化方式:

  • 用构造器来实例化
  • 使用 静态工厂方法实例化
  • 使用实例工厂方法实例化

简单来讲,对于Controller而言,Spring的处理方式是new一个然后使用。所以设置成静态是没必要的,SpringMVC的Controller默认是单例,非线程安全,最佳实践是设计成一个无状态的类。另外题主贴的代码可以改成这样的形式:


 @Controller
public class IndexController {


    private UserService userService;

    @Resources
    public void setUserService(UserService userService){
        this.userService = userService;
    }
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Map<String, Object> map, HttpServletRequest request, HttpSession session) {

        Integer uid = (Integer) session.getAttribute("uid");

        User user = userService.get(uid);
        map.put("user", user);

        return "index";
    }
}

van酱. answered 9 years, 1 month ago

为什么要设成static的呢?

5264213 answered 9 years, 1 month ago

1.楼主表达的不是很清楚,以至于我也不太明白你所谓的好是什么意思。
2.先说楼主提到问题,对controller加上static,这个controller并没有指定是单例,默认情况下就是多列,那么加上static,那么它是否是非线程安全的呢。
3.加上static用现在的话说,然并卵,并没有起到什么优化系统,提高效率等等作用。

缺失的一角 answered 9 years, 1 month ago

Your Answer