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

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

package spring.turbo.bean.classpath;

import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.lang.Nullable;
import spring.turbo.util.ClassUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import static spring.turbo.util.collection.CollectionUtils.nullSafeAddAll;

/**
 * {@link ClassPathScanner} 默认实现
 *
 * @author 应卓
 * @since 1.0.0
 */
final class DefaultClassPathScanner implements ClassPathScanner {

    private final ClassPathScannerCore provider = new ClassPathScannerCore();
    private ClassLoader classLoader = ClassUtils.getDefaultClassLoader();

    /**
     * 构造方法
     */
    DefaultClassPathScanner() {
    }

    @Override
    public List scan(@Nullable PackageSet packageSet) {
        if (packageSet == null) {
            return List.of();
        }

        final List list = new ArrayList<>();

        for (String basePackage : packageSet) {
            nullSafeAddAll(list, provider.findCandidateComponents(basePackage));
        }

        return list.stream().map(bd -> new ClassDefinition(bd, classLoader))
                .distinct()
                .sorted(Comparator.naturalOrder())
                .toList();
    }

    public void setResourceLoader(ResourceLoader resourceLoader) {
        provider.setResourceLoader(resourceLoader);
    }

    public void setEnvironment(Environment environment) {
        provider.setEnvironment(environment);
    }

    public void setIncludeTypeFilters(List filters) {
        filters.forEach(provider::addIncludeFilter);
    }

    public void setExcludeTypeFilters(List filters) {
        filters.forEach(provider::addExcludeFilter);
    }

    public void setClassLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    // -----------------------------------------------------------------------------------------------------------------

    /**
     * 扫描器核心
     */
    private static final class ClassPathScannerCore extends ClassPathScanningCandidateComponentProvider {

        /**
         * 私有构造方法
         */
        private ClassPathScannerCore() {
            super(false);
        }

        @Override
        protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
            boolean isCandidate = false;
            if (beanDefinition.getMetadata().isIndependent()) {
                if (!beanDefinition.getMetadata().isAnnotation()) {
                    isCandidate = true;
                }
            }
            return isCandidate;
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy