其他

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,配置代码如下:
  1. jboot.cache.type = mycache

通过以上三步,我们就可以完成了对JbootCache模块的扩展,其他模块类似。

JbootEvnet事件机制

为了解耦,Jboot内置了一个简单易用的事件系统,使用事件系统非常简单。

第一步,注册事件的监听器。

  1. @EventConfig(action = {"event1","event2"})
  2. public class MyEventListener implements JbootEventListener {
  3. public void onEvent(JbootEvent event){
  4. Object data = event.getData();
  5. System.out.println("get data:"+data);
  6. }
  7. }

通过 @EventConfig 配置 让MyEventListener监听上 event1和event2两个事件。

第二步,在项目任何地方发生事件

  1. Jboot.sendEvent("event1", object)

自定义序列化

自定义序列化是通过Jboot的SPI机制来实现的,请参考 SPI扩展

配置文件

读取jboot.properties的配置信息

要读取jboot.properties的配置信息非常简单,例如我们配置内容如下:

  1. jboot.myconfig.name=aaa
  2. jboot.myconfig.passowrd=bbb
  3. jboot.myconfig.age=10

要读取这个配置信息,我们需要定义我们的一个model类,并通过@PropertyConfig注解给我们的类配置上类与配置文件的对应关系,如下所示:

  1. @PropertyConfig(prefix="jboot.myconfig")
  2. public class MyConfigModel{
  3. private String name;
  4. private String password;
  5. private int age;
  6. //getter setter 略
  7. }

注意: 类名MyConfigModel随便取

编写好配置类MyConfigModel后,我们就可以通过如下代码来读取到配置信息:

  1. MyConfigModel config = Jboot.config(MyConfigModel.class);

读取自定义配置文件的配置信息

在以上章节中,我们已经知道了如何来读取jboot.properties的配置文件,在某些场景下,可能需要我们把我们的配置信息编写到一个独立的properties配置文件里面去,例如:在我们的项目中有一个叫 michael.properties 文件,文件的内容如下:

  1. jboot.myconfig.name=aaa
  2. jboot.myconfig.passowrd=bbb
  3. jboot.myconfig.age=10

那么,一样的,我们需要编写一个model,并配置上@PropertyConfig注解,与读取jboot.properties文件不同的是,@PropertyConfig 需要添加上file配置,内容如下:

  1. @PropertyConfig(prefix="jboot.myconfig",file="michael.properties")
  2. public class MyConfigModel{
  3. private String name;
  4. private String password;
  5. private int age;
  6. //getter setter 略
  7. }

然后,和读取jboot.properties一样。

  1. MyConfigModel config = Jboot.config(MyConfigModel.class);

分布式session

代码生成器

Jboot内置了一个简易的代码生成器,可以用来生成model层和Service层的基础代码,在生成代码之前,请先配置jboot.properties关于数据库相关的配置信息。

使用步骤

第一步:配置数据源

  1. jboot.datasource.type=mysql
  2. jboot.datasource.url=jdbc:mysql://127.0.0.1:3306/jbootdemo
  3. jboot.datasource.user=root
  4. jboot.datasource.password=your_password

第二步:通过JbootModelGenerator生成model代码

  1. public static void main(String[] args) {
  2. //model 的包名
  3. String modelPackage = "io.jboot.test";
  4. JbootModelGenerator.run(modelPackage);
  5. }

第三步:通过JbootServiceGenerator生成Service代码

  1. public static void main(String[] args) {
  2. //生成service 的包名
  3. String basePackage = "io.jboot.testservice";
  4. //依赖model的包名
  5. String modelPackage = "io.jboot.test";
  6. JbootServiceGenerator.run(basePackage, modelPackage);
  7. }

其他

当没在jboot.properties文件配置数据源的时候,可以通过如下代码来使用:

  1. public static void main(String[] args) {
  2. Jboot.setBootArg("jboot.datasource.url", "jdbc:mysql://127.0.0.1:3306/jbootdemo");
  3. Jboot.setBootArg("jboot.datasource.user", "root");
  4. String basePackage = "io.jboot.codegen.service.test";
  5. String modelPackage = "io.jboot.codegen.test.model";
  6. JbootServiceGenerator.run(basePackage, modelPackage);
  7. }