com.iqiny.silly.starter.SillyAutoConfiguration Maven / Gradle / Ivy
The newest version!
/*
* Copyright iqiny.com
*
* https://gitee.com/iqiny/silly
*
* project name:silly-spring-boot-starter
* project description:top silly project pom.xml file
*/
package com.iqiny.silly.starter;
import com.iqiny.silly.admin.controller.SillyAdminController;
import com.iqiny.silly.admin.controller.SillyAdminDataBoardController;
import com.iqiny.silly.admin.filter.SillyAdminSecurityAuthFilter;
import com.iqiny.silly.common.util.SillyReflectUtil;
import com.iqiny.silly.common.util.SillyThreadDataUtil;
import com.iqiny.silly.core.base.SillyAdminProperties;
import com.iqiny.silly.core.base.SillyContext;
import com.iqiny.silly.core.base.SillyLock;
import com.iqiny.silly.core.base.SillyProperties;
import com.iqiny.silly.core.base.impl.DefaultSillyLock;
import com.iqiny.silly.core.cache.SillyAsyncExecutor;
import com.iqiny.silly.core.cache.SillyCache;
import com.iqiny.silly.core.config.BaseSillyUserUtil;
import com.iqiny.silly.core.config.SillyConfigContent;
import com.iqiny.silly.core.config.SillyUserUtil;
import com.iqiny.silly.core.filter.SillyFilter;
import com.iqiny.silly.spring.common.SillyContextUtil;
import com.iqiny.silly.spring.controller.SillyController;
import com.iqiny.silly.spring.controller.SillyResultWrapper;
import com.iqiny.silly.spring.scan.AutoScanSillyConfigContent;
import com.iqiny.silly.starter.cache.SillyCaffeineCache;
import com.iqiny.silly.starter.executor.SillyThreadPoolAsyncExecutor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.Objects;
import java.util.concurrent.ThreadPoolExecutor;
import static org.springframework.util.StringUtils.tokenizeToStringArray;
/**
* 傻瓜Spring自动配置
*/
@Configuration
@EnableConfigurationProperties({StarterSillyProperties.class})
@ComponentScan(
basePackages = {
"com.iqiny.silly.spring",
}
)
@ConditionalOnProperty(value = "silly.enabled", matchIfMissing = true)
public class SillyAutoConfiguration {
@Bean
public SillyContext sillyContext() {
return SillyContextUtil.getSillyContext();
}
@Bean
@ConditionalOnMissingBean
public SillyConfigContent sillyConfigContent(SillyProperties sillyProperties, SillyContext sillyContext) {
AutoScanSillyConfigContent sillyConfigContent = new AutoScanSillyConfigContent(sillyProperties, sillyContext);
sillyConfigContent.init();
return sillyConfigContent;
}
@Bean
@ConditionalOnMissingBean
public SillyLock sillyLock() {
return new DefaultSillyLock();
}
@Bean
@ConditionalOnMissingBean
public SillyCache sillyCache() {
return new SillyCaffeineCache();
}
@Bean
@ConditionalOnMissingBean
public SillyResultWrapper sillyResultWrapper() {
return new SillyResultWrapper();
}
@Bean
@ConditionalOnMissingBean
public SillyAsyncExecutor sillyAsyncExecutor() {
final SillyThreadPoolAsyncExecutor executor = new SillyThreadPoolAsyncExecutor();
// 设置核心线程数
executor.setCorePoolSize(4);
// 设置最大线程数
executor.setMaxPoolSize(16);
// 设置队列容量
executor.setQueueCapacity(1024);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 设置默认线程名称
executor.setThreadNamePrefix("silly-thread-pool-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
@Bean
@ConditionalOnMissingBean
public SillyUserUtil sillyUserUtil() {
return new BaseSillyUserUtil() {
@Override
protected void recordAllUser() {
recordUser("admin", "系统管理员");
}
private final String threadDataKeyCurrentUserId = this.getClass().getName() + "threadDataKeyCurrentUserId";
@Override
public boolean isAdmin() {
return isAdmin(currentUserId());
}
@Override
public boolean isAdmin(String userId) {
// 默认将 userId = "admin" 的数据设置为管理员
return Objects.equals(userId, "admin");
}
@Override
public String currentUserId() {
return SillyThreadDataUtil.getThreadData(threadDataKeyCurrentUserId);
}
@Override
public String userIdToName(String userId) {
recordUser(userId, "name_" + userId);
return "name_" + userId;
}
@Override
public String userIdToOrgId(String userId) {
return "orgId_" + userId;
}
@Override
public String userIdToOrgName(String userId) {
return "orgName_" + userId;
}
@Override
public void setCurrentUser(String userId) {
SillyThreadDataUtil.setThreadData(threadDataKeyCurrentUserId, userId);
}
};
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnExpression("${silly.webController.enable:true}")
public SillyController sillyController() {
return new SillyController();
}
@Bean
@ConditionalOnExpression("${silly.filter.enable:true}")
public FilterRegistrationBean registerSillyFilter(SillyProperties sillyProperties) {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setOrder(sillyProperties.getFilterOrder());
String[] filterUrlPatternArray = tokenizeToStringArray(sillyProperties.getFilterUrlPatterns(),
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
bean.addUrlPatterns(filterUrlPatternArray);
Filter filter = SillyReflectUtil.newInstance(sillyProperties.getDefaultSillyFilterClazz());
if (filter instanceof SillyFilter) {
SillyFilter sillyFilter = (SillyFilter) filter;
sillyFilter.setParamName(sillyProperties.getFilterParamName());
}
bean.setFilter(filter);
return bean;
}
@Bean
@ConditionalOnExpression("${silly.admin.enable:false}")
public FilterRegistrationBean registerSillyAdminFilter(SillyProperties sillyProperties) {
final SillyAdminProperties admin = sillyProperties.getAdmin();
if (admin == null || !admin.isEnable()) {
return null;
}
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setOrder(100);
bean.addUrlPatterns("/silly-admin-ui.html", "/sillyAdmin/*");
bean.setFilter(new SillyAdminSecurityAuthFilter(admin.getUsername(), admin.getPassword()));
return bean;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnExpression("${silly.admin.enable:false}")
public SillyAdminController sillyAdminController() {
return new SillyAdminController();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnExpression("${silly.admin.enable:false}")
public SillyAdminDataBoardController dataBoardController() {
return new SillyAdminDataBoardController();
}
}