All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy