zoukankan      html  css  js  c++  java
  • SpringScan

    ClassPathBeanDefinitionScanner.java
    /**
         * Perform a scan within the specified base packages,
         * returning the registered bean definitions.
         * <p>This method does <i>not</i> register an annotation config processor
         * but rather leaves this up to the caller.
         * @param basePackages the packages to check for annotated classes
         * @return set of beans registered if any for tooling registration purposes (never {@code null})
         */
        protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
            Assert.notEmpty(basePackages, "At least one base package must be specified");
            Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<BeanDefinitionHolder>();
            for (String basePackage : basePackages) {
                Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
                for (BeanDefinition candidate : candidates) {
                    ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
                    candidate.setScope(scopeMetadata.getScopeName());
                    String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
                    if (candidate instanceof AbstractBeanDefinition) {
                        postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
                    }
                    if (candidate instanceof AnnotatedBeanDefinition) {
                        AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
                    }
                    if (checkCandidate(beanName, candidate)) {
                        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
                        definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
                        beanDefinitions.add(definitionHolder);
                        registerBeanDefinition(definitionHolder, this.registry);
                    }
                }
            }
            return beanDefinitions;
        }
    ClassPathScanningCandidateComponentProvider.java
    /**
         * Scan the class path for candidate components.
         * @param basePackage the package to check for annotated classes
         * @return a corresponding Set of autodetected bean definitions
         */
        public Set<BeanDefinition> findCandidateComponents(String basePackage) {
            Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();
            try {
                String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                        resolveBasePackage(basePackage) + "/" + this.resourcePattern;
                Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);
                boolean traceEnabled = logger.isTraceEnabled();
                boolean debugEnabled = logger.isDebugEnabled();
                for (Resource resource : resources) {
                    if (traceEnabled) {
                        logger.trace("Scanning " + resource);
                    }
                    if (resource.isReadable()) {
                        try {
                            MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
                            if (isCandidateComponent(metadataReader)) {
                                ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
                                sbd.setResource(resource);
                                sbd.setSource(resource);
                                if (isCandidateComponent(sbd)) {
                                    if (debugEnabled) {
                                        logger.debug("Identified candidate component class: " + resource);
                                    }
                                    candidates.add(sbd);
                                }
                                else {
                                    if (debugEnabled) {
                                        logger.debug("Ignored because not a concrete top-level class: " + resource);
                                    }
                                }
                            }
                            else {
                                if (traceEnabled) {
                                    logger.trace("Ignored because not matching any filter: " + resource);
                                }
                            }
                        }
                        catch (Throwable ex) {
                            throw new BeanDefinitionStoreException(
                                    "Failed to read candidate component class: " + resource, ex);
                        }
                    }
                    else {
                        if (traceEnabled) {
                            logger.trace("Ignored because not readable: " + resource);
                        }
                    }
                }
            }
            catch (IOException ex) {
                throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
            }
            return candidates;
        }



    /**
    * Determine whether the given class does not match any exclude filter
    * and does match at least one include filter.
    * @param metadataReader the ASM ClassReader for the class
    * @return whether the class qualifies as a candidate component
    */
    protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
    for (TypeFilter tf : this.excludeFilters) {
    if (tf.match(metadataReader, this.metadataReaderFactory)) {
    return false;
    }
    }
    for (TypeFilter tf : this.includeFilters) {
    if (tf.match(metadataReader, this.metadataReaderFactory)) {
    return isConditionMatch(metadataReader);
    }
    }
    return false;
    }
     
    ResourcePatternResolver.java

    /**
     * Strategy interface for resolving a location pattern (for example,
     * an Ant-style path pattern) into Resource objects.
     *
     * <p>This is an extension to the {@link org.springframework.core.io.ResourceLoader}
     * interface. A passed-in ResourceLoader (for example, an
     * {@link org.springframework.context.ApplicationContext} passed in via
     * {@link org.springframework.context.ResourceLoaderAware} when running in a context)
     * can be checked whether it implements this extended interface too.
     *
     * <p>{@link PathMatchingResourcePatternResolver} is a standalone implementation
     * that is usable outside an ApplicationContext, also used by
     * {@link ResourceArrayPropertyEditor} for populating Resource array bean properties.
     *
     * <p>Can be used with any sort of location pattern (e.g. "/WEB-INF/*-context.xml"):
     * Input patterns have to match the strategy implementation. This interface just
     * specifies the conversion method rather than a specific pattern format.
     *
     * <p>This interface also suggests a new resource prefix "classpath*:" for all
     * matching resources from the class path. Note that the resource location is
     * expected to be a path without placeholders in this case (e.g. "/beans.xml");
     * JAR files or classes directories can contain multiple files of the same name.
     *
     * @author Juergen Hoeller
     * @since 1.0.2
     * @see org.springframework.core.io.Resource
     * @see org.springframework.core.io.ResourceLoader
     * @see org.springframework.context.ApplicationContext
     * @see org.springframework.context.ResourceLoaderAware
     */
    public interface ResourcePatternResolver extends ResourceLoader {
    /**
    * Pseudo URL prefix for all matching resources from the class path: "classpath*:"
    * This differs from ResourceLoader's classpath URL prefix in that it
    * retrieves all matching resources for a given name (e.g. "/beans.xml"),
    * for example in the root of all deployed JAR files.
    * @see org.springframework.core.io.ResourceLoader#CLASSPATH_URL_PREFIX
    */
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

    /**
    * Resolve the given location pattern into Resource objects.
    * <p>Overlapping resource entries that point to the same physical
    * resource should be avoided, as far as possible. The result should
    * have set semantics.
    * @param locationPattern the location pattern to resolve
    * @return the corresponding Resource objects
    * @throws IOException in case of I/O errors
    */
    Resource[] getResources(String locationPattern) throws IOException;
    }
     
    PathMatchingResourcePatternResolver.java
    @Override
        public Resource[] getResources(String locationPattern) throws IOException {
            Assert.notNull(locationPattern, "Location pattern must not be null");
            if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
                // a class path resource (multiple resources for same name possible)
                if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
                    // a class path resource pattern
                    return findPathMatchingResources(locationPattern);
                }
                else {
                    // all class path resources with the given name
                    return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
                }
            }
            else {
                // Only look for a pattern after a prefix here
                // (to not get fooled by a pattern symbol in a strange prefix).
                int prefixEnd = locationPattern.indexOf(":") + 1;
                if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
                    // a file pattern
                    return findPathMatchingResources(locationPattern);
                }
                else {
                    // a single resource with the given name
                    return new Resource[] {getResourceLoader().getResource(locationPattern)};
                }
            }
        }


    /**
         * Find all resources that match the given location pattern via the
         * Ant-style PathMatcher. Supports resources in jar files and zip files
         * and in the file system.
         * @param locationPattern the location pattern to match
         * @return the result as Resource array
         * @throws IOException in case of I/O errors
         * @see #doFindPathMatchingJarResources
         * @see #doFindPathMatchingFileResources
         * @see org.springframework.util.PathMatcher
         */
        protected Resource[] findPathMatchingResources(String locationPattern) throws IOException {
            String rootDirPath = determineRootDir(locationPattern);
            String subPattern = locationPattern.substring(rootDirPath.length());
            Resource[] rootDirResources = getResources(rootDirPath);
            Set<Resource> result = new LinkedHashSet<Resource>(16);
            for (Resource rootDirResource : rootDirResources) {
                rootDirResource = resolveRootDirResource(rootDirResource);
                if (rootDirResource.getURL().getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {
                    result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirResource, subPattern, getPathMatcher()));
                }
                else if (isJarResource(rootDirResource)) {
                    result.addAll(doFindPathMatchingJarResources(rootDirResource, subPattern));
                }
                else {
                    result.addAll(doFindPathMatchingFileResources(rootDirResource, subPattern));
                }
            }
            if (logger.isDebugEnabled()) {
                logger.debug("Resolved location pattern [" + locationPattern + "] to resources " + result);
            }
            return result.toArray(new Resource[result.size()]);
        }
  • 相关阅读:
    团队冲刺六
    团队冲刺五
    【Mybaits学习】03_ CRUD基于注解
    【Mybaits学习】02_ 快速入门
    【Mybaits学习】01_ 初识
    深圳国际马拉松
    深圳南山半程马拉松
    Selenide使用笔记
    UI自动化测试01-环境搭建
    Java C3p0在Spring中运用
  • 原文地址:https://www.cnblogs.com/longxok/p/12160721.html
Copyright © 2011-2022 走看看