串行的处理过程(含六个事件扩展点 + 两个函数扩展点),代码直接、没有什么模式。易明

提醒:

  • 启动过程完成后,项目才能正常运行(启动过程中,不能把线程卡死了)
  • AppBeanLoadEndEvent 之前的事件,需要启动前通过 EventBus.subscribe(...) 订阅

1、事件订阅示例

  • AppLoadEndEvent
@Component
public class  AppLoadEndEventListener implements EventListener<AppLoadEndEvent>{
    @Override
    public void onEvent(AppLoadEndEvent event) throws Throwable {
        //event.app(); //获取应用对象
    }
}
  • AppStopEndEvent,v2.1.0 后支持
@Component
public class  AppStopEndEventListener implements EventListener<AppStopEndEvent>{
    @Override
    public void onEvent(AppStopEndEvent event) throws Throwable {
        //event.app(); //获取应用对象
    }
}

2、插件在应用生命周期里的时机点

插件的本质,即在应用生命周期中获得关键执行时机的接口。从而有效获得应用扩展能力。

  • 插件接口 Plugin
@FunctionalInterface
public interface Plugin {
    void start(AopContext context) throws Throwable;
    default void prestop() throws Throwable{}
    default void stop() throws Throwable{}
}
  • 执行时机
接口 执行时机 说明
start 在 7 时机点执行 启动
prestop 在 ::stop 前执行 预停止
stop 在 ::ShutdownHook 时执行 停止(启用安全停止时,prestop 后等几秒再执行 stop)

3、注解能力注册的合适时机点

  • 比如,时机点5
public class DemoApp{
    public void static main(String[] args){
        Solon.start(DemoApp.clas, args, app->{
            //比如注册Demo注解
            Solon.context().beanAroundAdd(DemoAop.class, new DemoInterceptor());
        });
    }
}
  • 比如,时机点6(借用 SolonBuilder,提前注册事件)
public class DemoApp{
    public void static main(String[] args){
        new SolonBuilder().onAppInitEnd(e -> {
            //...时机点6
        }).onAppLoadEnd(e->{
            //...时间点e          
        }).start(JobApp.class, args);
    }
}

定义一个插件

public class DemoPluginImp implements Plugin {
    @Override
    public void start(AopContext context) {
        //比如注册Demo注解
        context.beanAroundAdd(DemoAop.class, new DemoInterceptor());
    }
}

//可通过[时机点5]注册插件
public class DemoApp{
    public void static main(String[] args){
        Solon.start(DemoApp.clas, args, app->{
            app.pluginAdd(0, new DemoPluginImp()); //此处注册的插件,会在[时机点7]运行
        });
    }
}

//或可通过 app.yml 的配置,借用[时机点4]申明插件
//solon.plugin: "xxx.xxx.DemoPluginImp"