其他
SPI扩展
SPI的全名为Service Provider Interface。
SPI具体约定
当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而jboot装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。
Jboot SPI模块
在jboot中,一下模块已经实现了SPI机制。
- Jbootrpc
- JbootHttp
- JbootCache
- Jbootmq
- JbootSerializer
例如,在JbootCache中,内置了三种实现方案:ehcache、redis、ehredis。在配置文件中,我看可以通过 jboot.cache.type = ehcache
的方式来指定在Jboot应用中使用了什么样的缓存方案。
但是,在Jboot中,通过SPI机制,我们一样可以扩展出第4、第5甚至更多的缓存方案出来。
扩展步骤如下:
- 第一步:编写JbootCache的子类
- 第二步:通过@JbootSpi注解给刚刚编写的类设置上一个名字,例如:mycache
- 第三步:通过在jboot.properties文件中配置上类型为 mycache,配置代码如下:
jboot.cache.type = mycache
通过以上三步,我们就可以完成了对JbootCache模块的扩展,其他模块类似。
JbootEvnet事件机制
为了解耦,Jboot内置了一个简单易用的事件系统,使用事件系统非常简单。
第一步,注册事件的监听器。
@EventConfig(action = {"event1","event2"})
public class MyEventListener implements JbootEventListener {
public void onEvent(JbootEvent event){
Object data = event.getData();
System.out.println("get data:"+data);
}
}
通过 @EventConfig 配置 让MyEventListener监听上 event1和event2两个事件。
第二步,在项目任何地方发生事件
Jboot.sendEvent("event1", object)
自定义序列化
自定义序列化是通过Jboot的SPI机制来实现的,请参考 SPI扩展。
配置文件
读取jboot.properties的配置信息
要读取jboot.properties的配置信息非常简单,例如我们配置内容如下:
jboot.myconfig.name=aaa
jboot.myconfig.passowrd=bbb
jboot.myconfig.age=10
要读取这个配置信息,我们需要定义我们的一个model类,并通过@PropertyConfig注解给我们的类配置上类与配置文件的对应关系,如下所示:
@PropertyConfig(prefix="jboot.myconfig")
public class MyConfigModel{
private String name;
private String password;
private int age;
//getter setter 略
}
注意: 类名MyConfigModel随便取
编写好配置类MyConfigModel后,我们就可以通过如下代码来读取到配置信息:
MyConfigModel config = Jboot.config(MyConfigModel.class);
读取自定义配置文件的配置信息
在以上章节中,我们已经知道了如何来读取jboot.properties的配置文件,在某些场景下,可能需要我们把我们的配置信息编写到一个独立的properties配置文件里面去,例如:在我们的项目中有一个叫 michael.properties 文件,文件的内容如下:
jboot.myconfig.name=aaa
jboot.myconfig.passowrd=bbb
jboot.myconfig.age=10
那么,一样的,我们需要编写一个model,并配置上@PropertyConfig注解,与读取jboot.properties文件不同的是,@PropertyConfig 需要添加上file配置,内容如下:
@PropertyConfig(prefix="jboot.myconfig",file="michael.properties")
public class MyConfigModel{
private String name;
private String password;
private int age;
//getter setter 略
}
然后,和读取jboot.properties一样。
MyConfigModel config = Jboot.config(MyConfigModel.class);
分布式session
代码生成器
Jboot内置了一个简易的代码生成器,可以用来生成model层和Service层的基础代码,在生成代码之前,请先配置jboot.properties关于数据库相关的配置信息。
使用步骤
第一步:配置数据源
jboot.datasource.type=mysql
jboot.datasource.url=jdbc:mysql://127.0.0.1:3306/jbootdemo
jboot.datasource.user=root
jboot.datasource.password=your_password
第二步:通过JbootModelGenerator生成model代码
public static void main(String[] args) {
//model 的包名
String modelPackage = "io.jboot.test";
JbootModelGenerator.run(modelPackage);
}
第三步:通过JbootServiceGenerator生成Service代码
public static void main(String[] args) {
//生成service 的包名
String basePackage = "io.jboot.testservice";
//依赖model的包名
String modelPackage = "io.jboot.test";
JbootServiceGenerator.run(basePackage, modelPackage);
}
其他
当没在jboot.properties文件配置数据源的时候,可以通过如下代码来使用:
public static void main(String[] args) {
Jboot.setBootArg("jboot.datasource.url", "jdbc:mysql://127.0.0.1:3306/jbootdemo");
Jboot.setBootArg("jboot.datasource.user", "root");
String basePackage = "io.jboot.codegen.service.test";
String modelPackage = "io.jboot.codegen.test.model";
JbootServiceGenerator.run(basePackage, modelPackage);
}