loveqq 框架新特性:线程作用域(自动监听线程结束)/作用域刷新回调
loveqq-framework 作用域支持
singleton:单例作用域,整个应用上下文只有一个实例
prototype:原型作用域,有两种使用模式
1、不使用代理,该种模式下,每次获取都是一个新的实例,可用于对象级原型
2、代理模式,该种模式下,所有的注入都是同一个代理对象,可用于方法级别原型,方法调用结束后即销毁实例
refresh:刷新作用域,该作用域常用于配置类的实时更新,配置属性上下文更新的时候刷新实例
thread:线程作用域,java 线程的生命周期内有效,当线程销毁时,对应的 bean 自动执行销毁的生命周期
loveqq-framework 作用域刷新回调支持:ScopeRefreshed
当作用域刷新时,比如 @RefreshScope 刷新时,常规做法是将当前 bean 销毁,然后重新创建一个新的。
但是有些 bean 是有状态的,或者具有重量级初始化操作,不适合销毁重建。
此时 ScopeRefreshed 就派上了用场。
当 @RefreshScope 注解的 bean 需要刷新时,如果 bean 实现了 ScopeRefreshed 接口,则回调该接口,由开发者自身决定如何刷新,如果没有实现该接口,则依旧执行重建销毁流程。该逻辑同样适用于 @PrototypeScope / @ThreadScope。
下面是线程作用域的示例:
package com.kfyty.demo;
import com.kfyty.loveqq.framework.boot.K;
import com.kfyty.loveqq.framework.core.autoconfig.ApplicationContext;
import com.kfyty.loveqq.framework.core.autoconfig.DestroyBean;
import com.kfyty.loveqq.framework.core.autoconfig.InitializingBean;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Autowired;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.BootApplication;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Component;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.ThreadScope;
import com.kfyty.loveqq.framework.core.autoconfig.scope.ScopeRefreshed;
import com.kfyty.loveqq.framework.web.core.annotation.GetMapping;
import com.kfyty.loveqq.framework.web.core.annotation.RestController;
import com.kfyty.loveqq.framework.web.core.autoconfig.annotation.EnableWebMvc;
import com.kfyty.loveqq.framework.web.core.request.support.ResponseBodyEmitter;
@EnableWebMvc
@RestController
@BootApplication
public class Main {
@Autowired
private DemoService service;
@GetMapping
public ResponseBodyEmitter scope() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
new Thread(() -> {
emitter.send(service.current());
emitter.complete();
}).start();
return emitter;
}
@Component
@ThreadScope
public static class DemoService implements InitializingBean, DestroyBean, ScopeRefreshed {
private long s;
@Override
public void afterPropertiesSet() {
this.s = System.currentTimeMillis();
System.out.println("init demo service");
}
public String current() {
return String.valueOf(s);
}
@Override
public void onRefreshed(ApplicationContext applicationContext) {
s = System.currentTimeMillis();
System.out.println("refreshed demo service");
}
/**
* 线程运行结束后将自动执行该方法
*/
@Override
public void destroy() {
System.out.println("destroy demo service");
}
}
public static void main(String[] args) throws Exception {
K.run(Main.class, args);
}
}
上述代码,当访问 http://localhost:8080/scope 时,将返回当前的时间戳,因为每次都是新启线程执行。
当线程结束后,会回调 onRefreshed(ApplicationContext applicationContext) 接口,由开发者自身进行刷新。
当关闭容器时,会自动调用 destroy() 方法进行销毁。
感兴趣的同学可以了解下。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Forest v1.7.4 已经发布,轻量级 HTTP 客户端
Forest v1.7.4 已经发布,轻量级 HTTP 客户端 此版本更新内容包括: Forest v1.7.4 版本发布了!此次版本发布主要支持了在编程式接口中使用和修改字符串模板变量 编程式接口中的模板变量 可以在URL中使用模板变量 Forest.get("{baseURL}/test/{myPath}"); 可以在请求头中使用模板变量 Forest.post("/test") .addHeader("Content-Type", "{myContentType}") .addHeader("name", "{myName}"); 可以在字符串型请求体中使用模板变量 Forest.post("/test") .contentTypeJson() .addBody("{myBody}"); 可以在 K-V 型请求体中使用模板变量 Forest.post("/test") .contentFormUrlEncoded() .addBody("a", "{a}") .addBody("b", "{b}"); 其他可以使用模板变量的编程式接口 Forest.get("/") .host(...
-
下一篇
pgFormatter v5.8 发布,SQL 格式化工具
pgFormatter v5.8 现已发布,pgFormatter 是一款免费好用的 SQL 和 PLPGSQL 代码格式化工具,它提供了 CLI 和 CGI 两种界面。此版本增加了一些格式改进,并修复了自上次发布以来用户报告的一些问题。 以下是主要改进: 修复 JOIN 之后 WHERE 的错误缩进。 pgFormatter 现在能够区分单值和多值 INSERT 语句,并对其进行不同的格式化。以下是两者输出格式的示例: -- multiple values form INSERT INTO tempy_mc_tempface VALUES ('tempy'), ('mc'), ('tempface'); -- single values form INSERT INTO tempy_mc_tempface VALUES ('another', 'world'); 修复 DO 块中的 INSERT 语句的缩进问题。 修复 format() 函数占位符的错误格式。 有关更改的完整列表,可查看:https://github.com/darold/pgFormatter/blob/mas...
相关文章
文章评论
共有0条评论来说两句吧...