如何编写starter
优质
小牛编辑
133浏览
2023-12-01
如果你写了一个很棒的starter,恳请告知我们,报个issue即可,码云或者github均可
https://gitee.com/nutz/nutzboot
https://github.com/nutzam/nutzboot
基本结构
与NB项目一样, starter也是maven项目
- src
- main
- java
- net
- wendal
- time
- TimeStarter.java
- resources
- META-INF
- nutz
- org.nutz.boot.starter.NbStarter // 这是一个文本文件
org.nutz.boot.starter.NbStarter文件的内容,就是一行一个类全名,可以是无数个.
net.wendal.time.TimeStarter
Starter类怎么写?
首先,她是public的,非抽象的
public class TimeStarter {
}
然后,她通常需要读取一些环境数据,依赖ioc注入
@IocBean
public class TimeStarter {
@Inject("refer:$ioc")
protect Ioc ioc; // 获取ioc容器
@Inject
protect PropertiesProxy conf; // 获取配置信息
@Inject
protect AppContext appContext; // 获取全局上下文
}
以上是能注入的全部东西了,然而appContext对象内还有几个有用的实例.
获取上述对象后,你可以做到:
- 获取ioc容器内的任意对象,从而触发一些行为,例如数据库连接池的初始化
- 往ioc容器放入新的对象
- 获取,修改,移除配置信息
- 通过AppContext(其实Ioc和配置信息也是从它来的),你可以访问到其他starter
那,我这个starter对外提供什么呢?
- 她可以不对外提供任何东西,静静地看着你装逼
- 返回一个IocLoader,只需实现IocLoaderProvider接口,例如JedisStarter就是这样干的
- 声明为一个"服务器",例如JettyStarter,她启动了一个web容器,这时候你需要实现ServerFace
- 声明为一个"Filter",例如NutFilterStarter,她返回一个类似web.xml里面的filter定义,需要实现WebFilterFace接口
- 声明为一个"Servlet",例如DruidStatViewStarter,它返回一个servlet定义,需要实现WebServletFace
- 监听session开关?web容器的初始化? 实现WebEventListenerFace就行
NB的生命周期
- 读取日志配置信息
- 获取配置信息
- 初始化AppContext,Ioc容器等一切必要的基础设施
- 根据org.nutz.boot.starter.NbStarter读取starter类的列表,并将它们加入到ioc容器中
- 遍历starter,看看是否实现了IocLoaderProvider接口,获取IocLoader,加入ioc上下文
- 逐一执行各个"服务器"starter
- 等待程序结束
- 逐一关闭各个"服务器"starter
- 执行收尾工作