像 @Tran、@Cache 之类的注解开发成果,都会希望能在所有项目中复用。Solon Plugin 是一种解耦的插件扩展机制,简单、弹性、*。类似 Spring Factories、Java Spi。
Solon Plugin 机制的核心作用是:获得了应用启动入口,从而可以做一些事情。
1、Solon Plugin 机制
- 第一步:定制
插件实现类
//X开头可以让文件排序在未位,方便找到
public class XPluginImpl implements Plugin{
@Override
public void start(SolonApp app) {
//插件启动时...
}
}
- 第二步:通过
插件配置文件
申明自己,须全局唯一存在
约定插件配置文件:
#建议使用包做为文件名,便于识别,且可避免冲突
META-INF/solon/{packname}.properties
约定插件配置内容:
#插件实现类配置
solon.plugin={PluginImpl}
#插件优化级配置。越大越优先,默认为0
solon.plugin.priority=9
- 第三步:扫描并发现插件
程序启动时,扫描META-INF/solon/
目录下所有的.properties
文件,找到所有的插件并排序。
2、示例参考,插件:solon.extend.aspect
这个插件提供了 @Dao
和 @Service
扩展注解,进而实现Class的动态代理能力。
- 插件实现类:
src/main/java/org.noear.solon.extend.aspect.XPluginImp.java
package org.noear.solon.extend.aspect;
import org.noear.solon.SolonApp;
import org.noear.solon.core.Aop;
import org.noear.solon.core.Plugin;
import org.noear.solon.extend.aspect.annotation.Dao;
import org.noear.solon.extend.aspect.annotation.Service;
public class XPluginImp implements Plugin {
@Override
public void start(SolonApp app) {
Aop.context().beanBuilderAdd(Dao.class, (clz, bw, anno) -> {
BeanProxy.binding(bw);
});
Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> {
BeanProxy.binding(bw);
});
}
}
- 插件配置文件:
src/main/resources/META-INF/solon/solon.extend.aspect.properties
solon.plugin=org.noear.solon.extend.aspect.XPluginImp
- 插件应用示例
//
// 引入 org.noear:solon.extend.aspect 插件之后
//
@Service
public class AppService {
@Inject
SqlMapper sqlMapper1;
//
// @Service 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@Tran
//
@Tran
public void addApp(){
sqlMapper1.appx_add();
}
}