Spring作用域,事件

196 阅读2分钟

spring 作用域之间区别

  1. singleton : 默认单例, 容器只初始化一个实例

  2. prototype 原型范围: 每个bean 请求都初始化一个实例, 和单例相反。

  3. request : 在请求bean 范围内,为每个客户端请求实例化一个bean,请求完后 ,bean 失效并被垃圾回收器回收

  4. session: 确保每个session 都有一个实例

  5. global-session : 应用部署在portlet 容器,包含多个portlet, 当要声明所有portlet的共用全局变量,要存在global-session 中。 全局作用域和session 作用域效果一样

spring 中的单例beans 线程安全吗?

spring框架中单例线程安全要开发自行处理。实际上,大部分spring bean 没有可变的状态,此时线程安全。

如果单例bean 有多种状态(view model 对象),自行解决, 也可以把单例sigleton 变为原型范围 prototype

spring controller 默认是单例的 bean 作用域范围 @scope("Single") , 避免每次请求创建新对象

问题:多线程并发访问成员变量不安全

方案:

  1. 避免使用非静态成员变量

  2. 单例下,成员变量作为 LocalThread 线程本地变量维护

  3. @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个标准事件:

  1. 上下文更新事件ContextFefreshedEvent:

该事件在ApplicationContext被初始化或更新时发布。也可以在调用ConfigurableApplicationContext接口中refresh()方法中触发

2.上下文开始事件:调用ConfigurableApplicationContext接口中start()方法开始/重新开始容器时中触发该事件

3.上下文停止事件:调用ConfigurableApplicationContext接口中stop()方法 停止容器时触发该事件

4.请求处理事件

5.上下文关闭事件: 当ApplicationContext被关闭时触发。容器被关闭,其管理的所有单例bean被销毁

  1. 自定义事件: 继承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 




} 

}