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

spring.turbo.bean.classpath.ClassPathScannerBuilder Maven / Gradle / Ivy

package spring.turbo.bean.classpath;

import org.springframework.core.env.Environment;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.lang.Nullable;
import spring.turbo.core.ResourceLoaders;
import spring.turbo.util.ClassUtils;
import spring.turbo.util.collection.CollectionUtils;

import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

/**
 * ClassPath扫描器的创建器
 *
 * @author 应卓
 * @see ClassPathScanner#builder()
 * @see TypeFilter
 * @see TypeFilterFactories
 * @see Environment
 * @see ResourceLoader
 * @see ClassLoader
 * @since 1.0.0
 */
public final class ClassPathScannerBuilder {

    private final List includeFilters = new LinkedList<>();
    private final List excludeFilters = new LinkedList<>();
    private Environment environment = new StandardEnvironment();
    private ResourceLoader resourceLoader = ResourceLoaders.getDefault();
    private ClassLoader classLoader = ClassUtils.getDefaultClassLoader();

    /**
     * 默认构造方法
     */
    ClassPathScannerBuilder() {
    }

    /**
     * 添加包含类型描述器
     *
     * @param filters 类型描述器
     * @return this
     * @see TypeFilterFactories
     * @see org.springframework.core.type.filter.AbstractClassTestingTypeFilter
     * @see org.springframework.core.type.filter.AbstractTypeHierarchyTraversingFilter
     */
    public ClassPathScannerBuilder includeFilter(@Nullable TypeFilter... filters) {
        CollectionUtils.nullSafeAddAll(includeFilters, filters);
        return this;
    }

    /**
     * 添加排除类型描述器
     *
     * @param filters 类型描述器
     * @return this
     * @see TypeFilterFactories
     * @see org.springframework.core.type.filter.AbstractClassTestingTypeFilter
     * @see org.springframework.core.type.filter.AbstractTypeHierarchyTraversingFilter
     */
    public ClassPathScannerBuilder excludeFilter(@Nullable TypeFilter... filters) {
        CollectionUtils.nullSafeAddAll(excludeFilters, filters);
        return this;
    }

    /**
     * 添加 {@link Environment} 实例
     *
     * @param environment {@link Environment} 实例
     * @return this
     * @see org.springframework.context.EnvironmentAware
     */
    public ClassPathScannerBuilder environment(@Nullable Environment environment) {
        environment = Objects.requireNonNullElseGet(environment, StandardEnvironment::new);
        this.environment = environment;
        return this;
    }

    /**
     * 添加 {@link ResourceLoader} 实例
     *
     * @param resourceLoader {@link ResourceLoader} 实例
     * @return this
     * @see org.springframework.context.ResourceLoaderAware
     */
    public ClassPathScannerBuilder resourceLoader(@Nullable ResourceLoader resourceLoader) {
        resourceLoader = Objects.requireNonNullElseGet(resourceLoader, DefaultResourceLoader::new);
        this.resourceLoader = resourceLoader;
        return this;
    }

    /**
     * 添加 {@link ClassLoader} 实例
     *
     * @param classLoader {@link ClassLoader} 实例
     * @return this
     * @see ClassUtils#getDefaultClassLoader()
     */
    public ClassPathScannerBuilder classLoader(@Nullable ClassLoader classLoader) {
        classLoader = Objects.requireNonNullElseGet(classLoader, ClassUtils::getDefaultClassLoader);
        this.classLoader = classLoader;
        return this;
    }

    /**
     * 创建 {@link ClassPathScanner} 实例
     *
     * @return {@link ClassPathScanner} 实例
     */
    public ClassPathScanner build() {
        if (includeFilters.isEmpty()) {
            return packageSet -> List.of();
        } else {
            var scanner = new DefaultClassPathScanner();
            scanner.setIncludeTypeFilters(includeFilters);
            scanner.setExcludeTypeFilters(excludeFilters);
            scanner.setEnvironment(environment);
            scanner.setResourceLoader(resourceLoader);
            scanner.setClassLoader(classLoader);
            return scanner;
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy