wordpress企业中文模板下载地址,山西免费网站关键词优化排名,北京响应式网站制作公司,建设项目竣工环保验收公示网站一、什么是 SPI
SPI 全名 Service Provider interface#xff0c;翻译过来就是“服务提供接口”。基本效果是#xff0c;申明一个接口#xff0c;然后通过配置获取它的实现#xff0c;进而实现动态扩展。
Java SPI 是 JDK 内置的一种动态加载扩展点的实现。
一般的业务代…一、什么是 SPI
SPI 全名 Service Provider interface翻译过来就是“服务提供接口”。基本效果是申明一个接口然后通过配置获取它的实现进而实现动态扩展。
Java SPI 是 JDK 内置的一种动态加载扩展点的实现。
一般的业务代码中较少用到但是在底层框架中却大量使用包括 JDBC、Dubbo、Spring、Solon、slf4j 等框架都有用到不同的是有的使用 Java 原生的实现有的框架则自己实现了一套 SPI 机制.
二、Spring SPI
Spring 中的 SPI 相比于 JDK 原生的它的功能更强大些它可以替换的类型不仅仅局限于接口/抽象类它可以是任何一个类接口注解
正因为 Spring SPI 是支持替换注解类型的 SPI这个特性在 Spring Boot 中的自动装配有体现EnableAutoConfiguration注解
Spring 的 SPI 配置文件需要放在工程的 META-INF 下且文件名为 spring.factories 而文件的内容本质就是一个 properties如 spring-boot-autoconfigure 包下的 META-INF/spring.factories 文件用于自动装配的。
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, \
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, \
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration, \
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration, \
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, \
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,三、Solon SPI
相对于 Java SPI 和 Spring SPI 的“配置式”风格。Solon SPI 则是 “编码式” 风格。就有点儿像 Maven 和 Gradle。Solon SPI也称为 Solon Plugin SPI。 同样需要一个配置文件来申明 Plugin 的实现类。
约定插件配置文件且要求文件名是唯一的
#建议使用包做为文件名便于识别且可避免冲突
META-INF/solon/{packname}.properties约定插件配置内容就固定的两项
#插件实现类配置
solon.plugin{PluginImpl}
#插件优化级配置。越大越优先默认为0
solon.plugin.priority1插件代码示例相当于为整个 “模块” 提供了一个生命周期。把上面 Spring SPI 的配置翻译过来就是
public class SpringTranslatePlugin implements Plugin{Overridepublic void start(AppContext context) {//插件启动时...context.beanMake(SpringApplicationAdminJmxAutoConfiguration.class);context.beanMake(AopAutoConfiguration.class);context.beanMake(RabbitAutoConfiguration.class);context.beanMake(BatchAutoConfiguration.class);context.beanMake(CacheAutoConfiguration.class);context.beanMake(CassandraAutoConfiguration.class);}Overridepublic void prestop() throws Throwable {//插件预停止时启用安全停止时预停止后隔几秒才会进行停止}Overridepublic void stop(){//插件停止时}
}因为是 “编码式” 的。所以也可以做更复杂的控制处理。比如
public class SolonDataPlugin implements Plugin {Overridepublic void start(AppContext context) {//注册缓存工厂CacheLib.cacheFactoryAdd(local, new LocalCacheFactoryImpl());//添加事务控制支持if (context.app().enableTransaction()) {context.beanInterceptorAdd(Tran.class, TranInterceptor.instance, 120);}//添加缓存控制支持if (context.app().enableCaching()) {CacheLib.cacheServiceAddIfAbsent(, LocalCacheService.instance);context.subWrapsOfType(CacheService.class, new CacheServiceWrapConsumer());context.lifecycle(() - {if (context.hasWrap(CacheService.class) false) {context.wrapAndPut(CacheService.class, LocalCacheService.instance);}});context.beanInterceptorAdd(CachePut.class, new CachePutInterceptor(), 110);context.beanInterceptorAdd(CacheRemove.class, new CacheRemoveInterceptor(), 110);context.beanInterceptorAdd(Cache.class, new CacheInterceptor(), 111);}//自动构建数据源Props props context.cfg().getProp(solon.dataSources);if (props.size() 0) {context.app().onEvent(AppPluginLoadEndEvent.class, e - {//支持 ENC() 加密符VaultUtils.guard(props);buildDataSource(context, props);});}}
}