javaEE Controller 的方法能不能设置成 static
澳门新葡京
澳门新葡京
当前位置 : 澳门新葡京 > 澳门新葡京官方网站

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";

    @RequestMappingvalue = "/", method = RequestMethod.GET
    public static String indexMap<String, Object> map, HttpServletRequest request, HttpSession session {

        Integer uid = Integer session.getAttribute"uid";

        User user = userService.getuid;
        map.put"user", user;

        return "index";
    }
}

题主用的是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 setUserServiceUserService userService{
        this.userService = userService;
    }
    @RequestMappingvalue = "/", method = RequestMethod.GET
    public String indexMap<String, Object> map, HttpServletRequest request, HttpSession session {

        Integer uid = Integer session.getAttribute"uid";

        User user = userService.getuid;
        map.put"user", user;

        return "index";
    }
}

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

为什么要设成static的呢?

广告位

澳门新葡京