diff --git a/mybatis-plus-join-solon-plugin/pom.xml b/mybatis-plus-join-solon-plugin/pom.xml
new file mode 100644
index 0000000..5fd1732
--- /dev/null
+++ b/mybatis-plus-join-solon-plugin/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ com.github.yulichang
+ mybatis-plus-join-root
+ ${revision}
+
+
+ mybatis-plus-join-solon-plugin
+
+
+ 2.6.3
+ 8
+ 8
+ UTF-8
+
+
+
+
+ com.github.yulichang
+ mybatis-plus-join-extension
+ ${revision}
+
+
+ com.baomidou
+ mybatis-plus-core
+ ${mpj.mybatis.plus.version}
+ provided
+
+
+ org.noear
+ solon
+ ${solon.varrsion}
+ provided
+
+
+ org.noear
+ mybatis-solon-plugin
+ ${solon.varrsion}
+ provided
+
+
+ org.noear
+ mybatis-plus-solon-plugin
+ ${solon.varrsion}
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java
new file mode 100644
index 0000000..b6ab44f
--- /dev/null
+++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java
@@ -0,0 +1,91 @@
+package com.github.yulichang.mybatisplusjoin.solon.plugin;
+
+import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
+import com.github.yulichang.config.ConfigProperties;
+import com.github.yulichang.config.MPJInterceptorConfig;
+import com.github.yulichang.config.enums.IfAbsentEnum;
+import com.github.yulichang.config.enums.LogicDelTypeEnum;
+import com.github.yulichang.extension.mapping.config.MappingConfig;
+import com.github.yulichang.injector.MPJSqlInjector;
+import com.github.yulichang.toolkit.SpringContentUtils;
+import com.github.yulichang.toolkit.reflect.GenericTypeUtils;
+import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.solon.MybatisAdapter;
+import org.apache.ibatis.solon.integration.MybatisAdapterManager;
+import org.noear.solon.core.AppContext;
+import org.noear.solon.core.Plugin;
+import org.noear.solon.core.Props;
+import org.noear.solon.core.event.AppLoadEndEvent;
+import org.noear.solon.core.util.GenericUtil;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiPredicate;
+import java.util.stream.Collectors;
+
+public class XPluginImpl implements Plugin {
+
+ @Override
+ public void start(AppContext context) throws Throwable {
+ /* 设置 MPJSqlInjector
+ 反射修改GlobalConfigUtils.GLOBAL_CONFIG属性
+ 修改final修饰的变量会出现警告
+ 使用solon方式配置不生效采用的“曲线救国”方式
+ issue https://gitee.com/noear/solon/issues/I8SJ0Z */
+ Field field = GlobalConfigUtils.class.getDeclaredField("GLOBAL_CONFIG");
+ field.setAccessible(true);
+ Field modifier = Field.class.getDeclaredField("modifiers");
+ modifier.setAccessible(true);
+ modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL);
+ field.set(null, new ConcurrentHashMap() {
+ @Override
+ @SuppressWarnings("NullableProblems")
+ public GlobalConfig putIfAbsent(String key, GlobalConfig value) {
+ value.setSqlInjector(new MPJSqlInjector());
+ return super.putIfAbsent(key, value);
+ }
+ });
+ GenericTypeUtils.setGenericTypeResolver(GenericUtil::resolveTypeArguments);
+ // SpringContext兼容
+ SpringContentUtils.setSpringContext(new SpringContentUtils.SpringContext() {
+ @Override
+ public T getBean(Class clazz) {
+ return context.getBean(clazz);
+ }
+
+ @Override
+ public Map getBeansOfType(Class clazz) {
+ return context.getBeansMapOfType(clazz);
+ }
+ });
+ // 读取配置
+ Props prop = context.cfg().getProp("mybatis-plus-join");
+ ConfigProperties.banner = prop.getBool("banner", ConfigProperties.banner);
+ ConfigProperties.subTableLogic = prop.getBool("subTableLogic", ConfigProperties.subTableLogic);
+ ConfigProperties.msCache = prop.getBool("msCache", ConfigProperties.msCache);
+ ConfigProperties.tableAlias = prop.get("tableAlias", ConfigProperties.tableAlias);
+ ConfigProperties.joinPrefix = prop.get("joinPrefix", ConfigProperties.joinPrefix);
+ ConfigProperties.logicDelType = prop.getOrDefault("logicDelType", ConfigProperties.logicDelType, val ->
+ Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst()
+ .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误")));
+ ConfigProperties.mappingMaxCount = prop.getInt("mappingMaxCount", ConfigProperties.mappingMaxCount);
+ ConfigProperties.ifAbsent = prop.getOrDefault("ifAbsent", ConfigProperties.ifAbsent, val ->
+ Arrays.stream(IfAbsentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst()
+ .map(m -> (BiPredicate