七、内核支持的几种特殊 Bean
这些特殊 Bean 尽是用 "@Component" 注解:
接口 | 说明 |
---|---|
LifecycleBean | 带有生命周期接口的 Bean |
EventListener | 本地事件监听,会自动注册 EventBus |
Filter | 过滤器 |
RouterInterceptor | 路由拦截器 |
ActionExecuteHandler | 动作执行处理器。//用于执行Mvc参数整体转换及执行处理 |
ActionReturnHandler | 动作返回处理器。//用于特定Mvc返回类型处理 |
Render | 渲染器。//用于响应数据渲染输出 |
Converter | 转换器。//用于简单的配置转换与Mvc参数转换 |
ConverterFactory | 转换器工厂 |
LoadBalance.Factory | 负载平衡工厂 |
示例1:
- InitializingBean
//可以,通过组件顺序位控制 start 执行的优先级(一般,自动更好!)
@Component
public class DemoCom implements LifecycleBean{
@Override
public void start() throws Throwable{
//开始。在容器扫描完成后执行。如果依赖了别的 LifecycleBean,会自动排序
}
@Override
public void preStop() throws Throwable{
//预停止。在容器预停止时执行
}
@Override
public void stop() throws Throwable{
//停止。在容器停止时执行
}
}
- EventListener
//监听本地事件 //可以,通过组件顺序位控制优先级
@Component(index = 0)
public class DemoEventListener implements EventListener<DemoEvent>{
@Override
public void onEvent(DemoEvent event) throws Throwable{
}
}
//发布本地事件
EventBus.publish(new DemoEvent());
示例2:for web
- Filter
对所有请求有效,包括:静态文件请求,动态路由请求
//可以,通过组件顺序位控制优先级
@Component(index = 0)
public class DemoFilter implements Filter{
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable{
chain.doFilter(ctx);
}
}
- RouterInterceptor
对动态路由请求有效(即静态文件除外)
//可以,通过组件顺序位控制优先级
@Component(index = 0)
public class DemoRouterInterceptor implements RouterInterceptor{
@Override
public PathRule pathPatterns() {
//路径匹配规则(null 表示所有路径)
return null;
}
@Override
public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
//执行拦截
chain.doIntercept(ctx, mainHandler);
}
@Override
public Object postResult(Context ctx, @Nullable Object result) throws Throwable {
//提交结果确认(可以做类型转换,翻译等...)
return result;
}
}
- ActionExecuteHandler
对所有控制器的执行有效。定制时,基于 ActionExecuteHandlerDefault 做扩展会方便很多(不然,工作量太大)。一般,我们是因为增加新的内容类型,才有必要定制执行处理器,比如:增加 fury 序列化的数据提交处理。
@Component
public class DemoActionExecuteHandler implements ActionExecuteHandler {
@Override
public boolean matched(Context ctx, String ct) {
//执行匹配规则(主要对 context-type 做类型检测)
return ct.contains("/json");
}
@Override
public Object executeHandle(Context ctx, Object obj, MethodWrap mWrap) throws Throwable {
//执行
return null;
}
}
如果要替换默认执行器,需要手动控制:
public class App {
public static void main(String[] args){
Solon.start(App.class, args, app->{
app.chainManager().defExecuteHandler(Demo...)
});
}
}
- ActionReturnHandler
对所有控制器执行返回有效。框架的响应式 Mono、Flux,小推送 SSE 等返回的特殊类型,就是由这个机制实现的。
@Component
public class DemoActionReturnHandler implements ActionReturnHandler {
@Override
public boolean matched(Class<?> returnType) {
//类型匹配规则(当匹配时,则由 returnHandle 接管返回处理。否则按默认的 MVC 机制处理)
return false;
}
@Override
public void returnHandle(Context ctx, Action action, Object returnValue) throws Throwable {
//返回处理
}
}
- Render
对响应结果做渲染转换处理,并输出。
//替换现有的 "@json" 渲染器(即接管 json 渲染处理)
@Component("@json")
public class JsonRender implements Render{
@Override
public void render(Object data, Context ctx) throws Throwable {
ctx.output(JSON.toJson(data));
}
}
//或者通过控制器基类,对继承它的控制器有效
public class ControllerBase implements Render{
@Override
public void render(Object data, Context ctx) throws Throwable {
ctx.output(JSON.toJson(data));
}
}
@Controller
public class DemoController extends ControllerBase{
}
特殊的渲染处理,可以通过客户端 header 指定(一般用于 rpc 开发)。比如:
@Component("@demo")
public class JsonRender implements Render{
@Override
public void render(Object data, Context ctx) throws Throwable {
ctx.output(JSON.toJson(data));
}
}
//HttpUtils.http("http://...").header("X-Serialization","@demo").body(...).post()
- Converter 转换器
适用于简单的配置注入转换,及请求表单注入转换
@Component
public class DemoConverter implements Converter<String, Demo> {
@Override
public Demo convert(String value) throws ConvertException {
return Demo.parse(value);
}
}
//应用示例(http://....?demo=1。 通过转换器把 1 转为 Demo 实体)
@Controller
public class DemoController {
@Mapping("test")
public void test(Demo demo){
}
}