Browse Source

修复循环依赖问题

mxd 4 years ago
parent
commit
91f4b37a7a

+ 32 - 32
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -72,7 +72,7 @@ import java.util.function.BiFunction;
 @Configuration
 @ConditionalOnClass({RequestMappingHandlerMapping.class})
 @EnableConfigurationProperties(MagicAPIProperties.class)
-@Import({MagicRedisAutoConfiguration.class, MagicMongoAutoConfiguration.class, MagicSwaggerConfiguration.class, MagicJsonAutoConfiguration.class,ApplicationUriPrinter.class,ExportModule.class})
+@Import({MagicRedisAutoConfiguration.class, MagicMongoAutoConfiguration.class, MagicSwaggerConfiguration.class, MagicJsonAutoConfiguration.class, ApplicationUriPrinter.class, ExportModule.class})
 public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicAPIAutoConfiguration.class);
@@ -80,40 +80,40 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 	/**
 	 * 请求拦截器
 	 */
-	private final List<RequestInterceptor> requestInterceptors;
+	private final ObjectProvider<List<RequestInterceptor>> requestInterceptorsProvider;
 
 	/**
 	 * SQL拦截器
 	 */
-	private final List<SQLInterceptor> sqlInterceptors;
+	private final ObjectProvider<List<SQLInterceptor>> sqlInterceptorsProvider;
 
 	/**
 	 * 自定义的类型扩展
 	 */
-	private final List<ExtensionMethod> extensionMethods;
+	private final ObjectProvider<List<ExtensionMethod>> extensionMethodsProvider;
 
 	/**
 	 * 内置的消息转换
 	 */
-	private final List<HttpMessageConverter<?>> httpMessageConverters;
+	private final ObjectProvider<List<HttpMessageConverter<?>>> httpMessageConvertersProvider;
 
 	/**
 	 * 自定义的方言
 	 */
-	private final List<Dialect> dialects;
+	private final ObjectProvider<List<Dialect>> dialectsProvider;
 
 	/**
 	 * 自定义的列名转换
 	 */
-	private final List<ColumnMapperProvider> columnMapperProviders;
+	private final ObjectProvider<List<ColumnMapperProvider>> columnMapperProvidersProvider;
 
 
-	private final AuthorizationInterceptor authorizationInterceptor;
+	private final ObjectProvider<AuthorizationInterceptor> authorizationInterceptorProvider;
 
 	/**
 	 * 自定义的函数
 	 */
-	private final List<MagicFunction> magicFunctions;
+	private final ObjectProvider<List<MagicFunction>> magicFunctionsProvider;
 
 	private final Environment environment;
 
@@ -127,7 +127,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 	@Lazy
 	private RequestMappingHandlerMapping requestMappingHandlerMapping;
 
-	private final RestTemplate restTemplate;
+	private final ObjectProvider<RestTemplate> restTemplateProvider;
 
 	private String ALL_CLASS_TXT;
 
@@ -145,15 +145,15 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 									 ApplicationContext applicationContext
 	) {
 		this.properties = properties;
-		this.dialects = dialectsProvider.getIfAvailable(Collections::emptyList);
-		this.requestInterceptors = requestInterceptorsProvider.getIfAvailable(Collections::emptyList);
-		this.sqlInterceptors = sqlInterceptorsProvider.getIfAvailable(Collections::emptyList);
-		this.extensionMethods = extensionMethodsProvider.getIfAvailable(Collections::emptyList);
-		this.httpMessageConverters = httpMessageConvertersProvider.getIfAvailable(Collections::emptyList);
-		this.columnMapperProviders = columnMapperProvidersProvider.getIfAvailable(Collections::emptyList);
-		this.magicFunctions = magicFunctionsProvider.getIfAvailable(Collections::emptyList);
-		this.restTemplate = restTemplateProvider.getIfAvailable(this::createRestTemplate);
-		this.authorizationInterceptor = authorizationInterceptorProvider.getIfAvailable(this::createAuthorizationInterceptor);
+		this.dialectsProvider = dialectsProvider;
+		this.requestInterceptorsProvider = requestInterceptorsProvider;
+		this.sqlInterceptorsProvider = sqlInterceptorsProvider;
+		this.extensionMethodsProvider = extensionMethodsProvider;
+		this.httpMessageConvertersProvider = httpMessageConvertersProvider;
+		this.columnMapperProvidersProvider = columnMapperProvidersProvider;
+		this.magicFunctionsProvider = magicFunctionsProvider;
+		this.restTemplateProvider = restTemplateProvider;
+		this.authorizationInterceptorProvider = authorizationInterceptorProvider;
 		this.environment = environment;
 		this.applicationContext = applicationContext;
 	}
@@ -203,7 +203,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 	@ConditionalOnProperty(prefix = "magic-api", name = "resource.type", havingValue = "database")
 	public Resource magicDatabaseResource(MagicDynamicDataSource magicDynamicDataSource) {
 		ResourceConfig resourceConfig = properties.getResource();
-		if(magicDynamicDataSource.isEmpty()){
+		if (magicDynamicDataSource.isEmpty()) {
 			throw new MagicAPIException("当前未配置数据源,如已配置,请引入 spring-boot-starter-jdbc 后在试!");
 		}
 		MagicDynamicDataSource.DataSourceNode dataSourceNode = magicDynamicDataSource.getDataSource(resourceConfig.getDatasource());
@@ -245,7 +245,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(new MagicWebRequestInterceptor(properties.isSupportCrossDomain() ? magicCorsFilter : null, authorizationInterceptor))
+		registry.addInterceptor(new MagicWebRequestInterceptor(properties.isSupportCrossDomain() ? magicCorsFilter : null, authorizationInterceptorProvider.getIfAvailable(this::createAuthorizationInterceptor)))
 				.addPathPatterns("/**");
 	}
 
@@ -382,16 +382,16 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 		SQLModule sqlModule = new SQLModule(dynamicDataSource);
 		sqlModule.setResultProvider(resultProvider);
 		sqlModule.setPageProvider(pageProvider);
-		sqlModule.setSqlInterceptors(sqlInterceptors);
+		sqlModule.setSqlInterceptors(sqlInterceptorsProvider.getIfAvailable(Collections::emptyList));
 		ColumnMapperAdapter columnMapperAdapter = new ColumnMapperAdapter();
-		this.columnMapperProviders.stream().filter(mapperProvider -> !"default".equals(mapperProvider.name())).forEach(columnMapperAdapter::add);
+		this.columnMapperProvidersProvider.getIfAvailable(Collections::emptyList).stream().filter(mapperProvider -> !"default".equals(mapperProvider.name())).forEach(columnMapperAdapter::add);
 		columnMapperAdapter.setDefault(properties.getSqlColumnCase());
 		sqlModule.setColumnMapperProvider(columnMapperAdapter);
 		sqlModule.setColumnMapRowMapper(columnMapperAdapter.getDefaultColumnMapRowMapper());
 		sqlModule.setRowMapColumnMapper(columnMapperAdapter.getDefaultRowMapColumnMapper());
 		sqlModule.setSqlCache(sqlCache);
 		DialectAdapter dialectAdapter = new DialectAdapter();
-		dialects.forEach(dialectAdapter::add);
+		dialectsProvider.getIfAvailable(Collections::emptyList).forEach(dialectAdapter::add);
 		sqlModule.setDialectAdapter(dialectAdapter);
 		return sqlModule;
 	}
@@ -444,7 +444,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 		});
 		if (MagicResourceLoader.loadModule("http") == null) {
 			logger.info("注册模块:{} -> {}", "http", HttpModule.class);
-			MagicResourceLoader.addModule("http", new HttpModule(this.restTemplate));
+			MagicResourceLoader.addModule("http", new HttpModule(this.restTemplateProvider.getIfAvailable(this::createRestTemplate)));
 		}
 		MagicResourceLoader.getModuleNames().stream().filter(importModules::contains).forEach(moduleName -> {
 			logger.info("自动导入模块:{}", moduleName);
@@ -485,7 +485,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 		Constants.RESPONSE_CODE_INVALID = responseCodeConfig.getInvalid();
 		Constants.RESPONSE_CODE_EXCEPTION = responseCodeConfig.getException();
 		// 设置模块和扩展方法
-		setupMagicModules(resultProvider, magicModules, extensionMethods, languageProviders);
+		setupMagicModules(resultProvider, magicModules, extensionMethodsProvider.getIfAvailable(Collections::emptyList), languageProviders);
 		MagicConfiguration configuration = new MagicConfiguration();
 		configuration.setMagicAPIService(magicAPIService);
 		configuration.setApiServiceProvider(apiServiceProvider);
@@ -494,14 +494,14 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 		configuration.setFunctionServiceProvider(functionServiceProvider);
 		SecurityConfig securityConfig = properties.getSecurityConfig();
 		configuration.setDebugTimeout(properties.getDebugConfig().getTimeout());
-		configuration.setHttpMessageConverters(Optional.ofNullable(httpMessageConverters).orElse(Collections.emptyList()));
+		configuration.setHttpMessageConverters(httpMessageConvertersProvider.getIfAvailable(Collections::emptyList));
 		configuration.setResultProvider(resultProvider);
 		configuration.setThrowException(properties.isThrowException());
 		configuration.setEditorConfig(properties.getEditorConfig());
 		configuration.setWorkspace(magicResource);
-		configuration.setAuthorizationInterceptor(authorizationInterceptor);
+		configuration.setAuthorizationInterceptor(authorizationInterceptorProvider.getIfAvailable(this::createAuthorizationInterceptor));
 		// 注册函数
-		this.magicFunctions.forEach(JavaReflection::registerFunction);
+		this.magicFunctionsProvider.getIfAvailable(Collections::emptyList).forEach(JavaReflection::registerFunction);
 		// 向页面传递配置信息时不传递用户名密码,增强安全性
 		securityConfig.setUsername(null);
 		securityConfig.setPassword(null);
@@ -523,14 +523,14 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 			controllers.forEach(item -> mappingHandlerMapping.registerController(item, base));
 		}
 		// 注册接收推送的接口
-		if(StringUtils.isNotBlank(properties.getSecretKey())){
+		if (StringUtils.isNotBlank(properties.getSecretKey())) {
 			RequestMappingInfo requestMappingInfo = RequestMappingInfo.paths(properties.getPushPath()).build();
 			Method method = MagicWorkbenchController.class.getDeclaredMethod("receivePush", MultipartFile.class, String.class, Long.class, String.class);
-			Mapping.create(requestMappingHandlerMapping).register(requestMappingInfo,magicWorkbenchController, method);
+			Mapping.create(requestMappingHandlerMapping).register(requestMappingInfo, magicWorkbenchController, method);
 		}
 		magicAPIService.registerAllDataSource();
 		// 设置拦截器信息
-		this.requestInterceptors.forEach(interceptor -> {
+		this.requestInterceptorsProvider.getIfAvailable(Collections::emptyList).forEach(interceptor -> {
 			logger.info("注册请求拦截器:{}", interceptor.getClass());
 			configuration.addRequestInterceptor(interceptor);
 		});