有时我必须在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";
}
两个建议有哪些优点和缺点?
答案 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功能。