spring 作用域之间区别
-
singleton : 默认单例, 容器只初始化一个实例
-
prototype 原型范围: 每个bean 请求都初始化一个实例, 和单例相反。
-
request : 在请求bean 范围内,为每个客户端请求实例化一个bean,请求完后 ,bean 失效并被垃圾回收器回收
-
session: 确保每个session 都有一个实例
-
global-session : 应用部署在portlet 容器,包含多个portlet, 当要声明所有portlet的共用全局变量,要存在global-session 中。 全局作用域和session 作用域效果一样
spring 中的单例beans 线程安全吗?
spring框架中单例线程安全要开发自行处理。实际上,大部分spring bean 没有可变的状态,此时线程安全。
如果单例bean 有多种状态(view model 对象),自行解决, 也可以把单例sigleton 变为原型范围 prototype
spring controller 默认是单例的 bean 作用域范围 @scope("Single") , 避免每次请求创建新对象
问题:多线程并发访问成员变量不安全
方案:
-
避免使用非静态成员变量
-
单例下,成员变量作为 LocalThread 线程本地变量维护
-
@scope("Prototype") 注解显示使用多例,但频繁创建对象,会增加内存和CPU 负担。
bean scope 范围:
single 默认单例 只创建一次
prototype 多例,每次请求都创建新实例
session 同一个session 只创建一次实例
request:同一次请求只创建一次实例
global session: 全局web域共用一个实例 ,类似servlet application
Spring 框架中不用类型的事件
Spring 的ApplicationContext 提供支持事件和监听功能 。 创建bean 时监听ApplicaitonContext 发布的事件。Bean 实现ApplicationListener接口,当ApplicationEvent发布一个事件,Bean 会自动通知
5个标准事件:
- 上下文更新事件ContextFefreshedEvent:
该事件在ApplicationContext被初始化或更新时发布。也可以在调用ConfigurableApplicationContext接口中refresh()方法中触发
2.上下文开始事件:调用ConfigurableApplicationContext接口中start()方法开始/重新开始容器时中触发该事件
3.上下文停止事件:调用ConfigurableApplicationContext接口中stop()方法 停止容器时触发该事件
4.请求处理事件
5.上下文关闭事件: 当ApplicationContext被关闭时触发。容器被关闭,其管理的所有单例bean被销毁
- 自定义事件: 继承ApplicationEvent 开发自定义事件
public class CustomApplicationEvent extends ApplicationEvent{
public CustomApplicationEvent ( Object source, final String ms g ){ super(source);
System.out.println("Created a Custom event");
}
}
为了监听定义事件,创建监听器 实现ApplicationListener
public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{
@Override public void onApplicationEvent(CustomApplicationEventapplicationEvent) {
//handle event
}
}