Spring框架里面还有一个没有注册的Scope,SimpleThreadScope,通过这个学习下怎么自定义Scope。
把BeanConfig中PojoBean的配置改成@Scope("simpleThreadScope"),启动应用程序报错,如下两图:
原来是这个Scope没有注册,创建一个ApplicationListener用来注册simpleThreadScope,监听ApplicationPreparedEvent,在应用上下文准备好的时候注册这个simpleThreadScope,如下图:
在resources文件下建立文件夹META-INF,META-INF文件夹下面新建文件spring.factories,在文件中配置上图创建的ApplicationListener,如下两图:
重新启动应用,控制台打印如下图:
PojoBean只初始化一次,两个Service中的实例也相同,因为是同一个线程实例的,下面写个多线程测试下。
在BeanConfig中新配置一个CommandRunner Bean,它可以在应用启动后运行,如下图:
控制台的打印如下图:
日志有点多,耐心查看下,发现PojoBean实例了三次,第一次是之前的ServiceA和ServiceB中引用的PojoBean,它是属于主线程的PojoBean。后面又实例了两个PojoBean,它们分别是Thread-5和Thread-4的PojoBean,从这里看出SimleThreadScope起作用了,如果要自定义Scope的话,就可以参考这个类。
注意:SimleThreadScope也是只负责到创建生命周期,后面的生命周期要自己管理。