在Spring MVC Controller中声明变量的最佳实践是什么?

时间:2014-09-05 10:08:10

标签: java spring spring-mvc

有时我必须在Spring controller中声明变量。由于spring控制器就像只在start时创建的bean,因此控制器中声明的变量必须是静态的。我知道静态可能会占用更多的内存。不是垃圾收集 我有两个选项来在Spring控制器中声明变量,我想知道哪一个更好。

建议一:

@Controller
@requestMapping("parent")
public Class ControllerClazz{
  private String varible ="ABC";

} 

建议二:

@Controller
@requestMapping("parent")
public Class ControllerClazz{
  private static String varible ="ABC";

} 

两个建议有哪些优点和缺点?

2 个答案:

答案 0 :(得分:3)

Spring MVC controllers默认为单例。对于所有请求和所有会话,将永久共享和显示对象字段。

但是,如果没有任何synchronization,您可能遇到各种concurrency问题(竞争条件,可见性)。因此,您的字段应该volatile(并且private,顺便说一下)修饰符,以避免可见性问题。

Spring中,您可以使用request-(请参阅4.5.4.2 Request scope)和session-scoped(请参阅:4.5.4.3 Session scope)bean。你可以将它们注入控制器和任何其他bean(甚至是单例!),但是Spring确保每个请求/会话都有一个独立的实例。

答案 1 :(得分:3)

spring控制器的本质是由IOC容器管理的单个组件(类似于Servlet API中的servlet),因此最佳做法是除了那些处理对IOC容器注入的其他组件的引用之外的任何变量

在你的情况下,尝试将变量外部化为一个单独的类,如果变量永远不会改变,也不要忘记使用final修饰符。如果您要更改变量,请考虑使用java.util.concurrent功能。

也总是试着坚持single responsibility principle