可以直接看原文:https://www.cnblogs.com/fingerboy/p/5425813.html
下面是我补充的几个知识点,也可以顺便看一下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IOC容器解决问题的核心就是把创建和管理对象的控制权从具体的业务对象手中抢过来.由IOC容器来管理对象之间的依赖关系,并由IOC容器完成对象的注入.这样就把应用从复杂的对象依赖关系的管理中解放出来,简化了程序的开发过程.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
springmvc controller默认的是单例singleton的,单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。采用单例模式的好处:
- 为了性能,单例不用每次都new,当然快了。
- 不需要多例,这是官方说法。
单例模式下容易出现的问题就是controller中定义很多的属性,那么单例肯定会出现竞争访问,不同用户共享数据变量是不安全的。因此:
- 不要在controller中定义成员变量。
- 万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- 在Controller中使用ThreadLocal变量
当然可以修改controller 为多列模式,通过@controller之前增加@Scope("prototype"),或者配置文件定义修改。
Struts2默认的实现是Prototype模式,Struts2中的Action因为会有User、BizEntity这样的实例对象,是有状态信息的,在多线程环境下是不安全的,所以是多例。
链接:https://www.jianshu.com/p/0443268f5b6a