Browse Source

解决容器初始化时机问题导致的容器上下文对象为空(待优化).

https://github.com/baomidou/mybatis-plus/issues/6791
聂秋荣 19 hours ago
parent
commit
33119e5f8b

+ 9 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/spi/CompatibleSet.java

@@ -63,4 +63,13 @@ public interface CompatibleSet {
         return null;
     }
 
+    /**
+     * 传递上下文对象
+     * @param context 容器上下文
+     * @since 3.5.13
+     */
+    default void setContext(Object context) {
+
+    }
+
 }

+ 13 - 6
mybatis-plus-spring/src/main/java/com/baomidou/mybatisplus/extension/spi/SpringCompatibleSet.java

@@ -45,6 +45,8 @@ public class SpringCompatibleSet implements CompatibleSet {
 
     private static final Log LOG = LogFactory.getLog(SpringCompatibleSet.class);
 
+    private static volatile ApplicationContext applicationContext;
+
     @Override
     public SqlSession getSqlSession(SqlSessionFactory sessionFactory) {
         return SqlSessionUtils.getSqlSession(sessionFactory);
@@ -99,13 +101,13 @@ public class SpringCompatibleSet implements CompatibleSet {
 
     @Override
     public <T> T getBean(Class<T> clz) {
-        if (MybatisPlusApplicationContextAware.hasApplicationContext()) {
-            ApplicationContext applicationContext = MybatisPlusApplicationContextAware.getApplicationContext();
-            ObjectProvider<T> provider = applicationContext.getBeanProvider(clz);
-            return provider.getIfAvailable();
+        if (applicationContext == null && !MybatisPlusApplicationContextAware.hasApplicationContext()) {
+            LOG.warn("MybatisPlusApplicationContextAware is not initialized. Please ensure that MybatisPlusApplicationContextAware is properly registered as a Spring Bean in the application context.");
+            return null;
         }
-        LOG.warn("MybatisPlusApplicationContextAware is not initialized. Please ensure that MybatisPlusApplicationContextAware is properly registered as a Spring Bean in the application context.");
-        return null;
+        ApplicationContext context = applicationContext !=null  ? applicationContext : MybatisPlusApplicationContextAware.getApplicationContext();
+        ObjectProvider<T> provider = context.getBeanProvider(clz);
+        return provider.getIfAvailable();
     }
 
     @Override
@@ -119,4 +121,9 @@ public class SpringCompatibleSet implements CompatibleSet {
         return result;
     }
 
+    @Override
+    public void setContext(Object context) {
+        applicationContext = (ApplicationContext) context;
+    }
+
 }

+ 4 - 0
spring-boot-starter/mybatis-plus-spring-boot-autoconfigure/src/main/java/com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.core.spi.CompatibleHelper;
 import com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import org.apache.ibatis.annotations.Mapper;
@@ -148,6 +149,9 @@ public class MybatisPlusAutoConfiguration implements InitializingBean {
         if (!CollectionUtils.isEmpty(mybatisPlusPropertiesCustomizers)) {
             mybatisPlusPropertiesCustomizers.forEach(i -> i.customize(properties));
         }
+        if (CompatibleHelper.hasCompatibleSet()) {
+            CompatibleHelper.getCompatibleSet().setContext(applicationContext);
+        }
         checkConfigFileExists();
     }