package com.iplatform.base.config; import com.iplatform.base.FileOperateSpi; import com.iplatform.base.SecuritySpi; import com.iplatform.core.PlatformConfiguration; import com.walker.infrastructure.utils.ClassUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.lang.reflect.Constructor; /** * SecuritySPI实现配置对象,虽然是在基础模块配置,但实现可以通过引入各种第三方来实现。

* 如:spring security 或者 shiro等,默认: sepring security。 * @date 2022-11-11 * @author 时克英 */ @Configuration public class SpiConfig extends PlatformConfiguration { private final String DEFAULT_SECURITY_SPI_CLASS = "com.iplatform.security.DefaultSecuritySpi"; private final String NOTHING_SECURITY_SPI_CLASS = "com.iplatform.base.support.NothingSecuritySpi"; private final String DEFAULT_FILE_OPERATE_SPI_CLASS = "com.iplatform.file.DefaultFileOperateSpi"; /** * 文件基本信息配置,放在 Base spi 模块配置,可让 file 模块复用。 * @return * @date 2023-02-15 */ @Bean public FileProperties fileProperties(){ return new FileProperties(); } @Bean public FileOperateSpi fileOperateSpi(){ try { FileOperateSpi fileOperateSpi = this.acquireFileOperateSpi(DEFAULT_FILE_OPERATE_SPI_CLASS); logger.info("创建 'FileOperateSpi' 实现对象成功: " + DEFAULT_FILE_OPERATE_SPI_CLASS); return fileOperateSpi; } catch (Exception e) { if(e instanceof ClassNotFoundException){ logger.error("创建'FileOperateSpi'提供者对象错误, 实现类不存在: " + DEFAULT_FILE_OPERATE_SPI_CLASS); } throw new RuntimeException("创建 'FileOperateSpi' 异常: " + DEFAULT_FILE_OPERATE_SPI_CLASS, e); } } @Bean public SecuritySpi securitySpi(){ try { // Class schedulerClass = ClassUtils.forName(DEFAULT_SECURITY_SPI_CLASS, SpiConfig.class.getClassLoader()); // Constructor constructor = (Constructor)schedulerClass.getConstructor(); // SecuritySpi securitySpi = constructor.newInstance(); SecuritySpi securitySpi = this.acquireSecuritySpi(DEFAULT_SECURITY_SPI_CLASS); logger.info("创建 SecuritySpi 实现对象成功: " + DEFAULT_SECURITY_SPI_CLASS); return securitySpi; } catch (Exception e) { if(e instanceof ClassNotFoundException){ logger.error("创建'SecuritySpi'提供者对象错误, 实现类不存在: " + DEFAULT_SECURITY_SPI_CLASS); logger.warn("创建内置默认SPI: " + NOTHING_SECURITY_SPI_CLASS); try { return this.acquireSecuritySpi(NOTHING_SECURITY_SPI_CLASS); } catch (Exception ex) { logger.error(".............", ex); throw new RuntimeException("创建内置SPI异常: " + NOTHING_SECURITY_SPI_CLASS, ex); } } else { throw new RuntimeException("创建SPI异常:" + e.getMessage(), e); } } // catch (NoSuchMethodException e) { // logger.error("创建'SecuritySpi'提供者对象错误, 默认构造方法不存在", e); // throw new RuntimeException(e); // } catch (Exception ex){ // throw new RuntimeException(ex); // } } private FileOperateSpi acquireFileOperateSpi(String clazzName) throws Exception{ Class schedulerClass = ClassUtils.forName(clazzName, SpiConfig.class.getClassLoader()); Constructor constructor = (Constructor)schedulerClass.getConstructor(); FileOperateSpi securitySpi = constructor.newInstance(); return securitySpi; } private SecuritySpi acquireSecuritySpi(String clazzName) throws Exception{ Class schedulerClass = ClassUtils.forName(clazzName, SpiConfig.class.getClassLoader()); Constructor constructor = (Constructor)schedulerClass.getConstructor(); SecuritySpi securitySpi = constructor.newInstance(); return securitySpi; } }