2014-09-05 70 views
0

有时候我必须在Spring控制器中声明变量。由于spring控制器就像只在开始时创建的bean,所以在控制器中声明的变量必须是静态的。我知道静态可能会利用更多的内存,而不是垃圾收集。
我有两个选择在Spring控制器中声明变量,我想要哪些更好的建议。在Spring MVC控制器中声明变量的最好方法是什么

建议一:

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

} 

建议二:

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

} 

有什么利弊上述两个建议?

回答

3

默认情况下,Spring MVC controllers是单身。对象字段将永久共享并可见于所有请求和所有会话。

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

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

3

Spring控制器的本质是由IOC容器管理的单个组件(类似于Servlet API中的Servlet),所以最佳实践是除了那些处理对IOC注入的其他组件的引用的最佳实践容器。

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

也总是试图坚持single responsibility principle

相关问题