Search in sources :

Example 36 with MethodMetadata

use of org.springframework.core.type.MethodMetadata in project spring-cloud-config by spring-cloud.

the class CompositeUtils method getEnvironmentRepositoryFactoryTypeParams.

/**
 * Given a Factory Name return the generic type parameters of the factory (The actual
 * repository class, and its properties class).
 * @param beanFactory Spring Bean Factory
 * @param factoryName name of the factory
 * @return generic type params of the factory
 */
public static Type[] getEnvironmentRepositoryFactoryTypeParams(ConfigurableListableBeanFactory beanFactory, String factoryName) {
    MethodMetadata methodMetadata = (MethodMetadata) beanFactory.getBeanDefinition(factoryName).getSource();
    Class<?> factoryClass = null;
    try {
        factoryClass = Class.forName(methodMetadata.getReturnTypeName());
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException(e);
    }
    Optional<AnnotatedType> annotatedFactoryType = Arrays.stream(factoryClass.getAnnotatedInterfaces()).filter(i -> {
        ParameterizedType parameterizedType = (ParameterizedType) i.getType();
        return parameterizedType.getRawType().equals(EnvironmentRepositoryFactory.class);
    }).findFirst();
    ParameterizedType factoryParameterizedType = (ParameterizedType) annotatedFactoryType.orElse(factoryClass.getAnnotatedSuperclass()).getType();
    return factoryParameterizedType.getActualTypeArguments();
}
Also used : Arrays(java.util.Arrays) MethodMetadata(org.springframework.core.type.MethodMetadata) AnnotatedType(java.lang.reflect.AnnotatedType) BeanFactoryUtils(org.springframework.beans.factory.BeanFactoryUtils) Collectors(java.util.stream.Collectors) ConfigurableListableBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory) List(java.util.List) ParameterizedType(java.lang.reflect.ParameterizedType) EnvironmentRepositoryFactory(org.springframework.cloud.config.server.environment.EnvironmentRepositoryFactory) Type(java.lang.reflect.Type) Environment(org.springframework.core.env.Environment) Map(java.util.Map) Optional(java.util.Optional) Binder(org.springframework.boot.context.properties.bind.Binder) ParameterizedType(java.lang.reflect.ParameterizedType) AnnotatedType(java.lang.reflect.AnnotatedType) MethodMetadata(org.springframework.core.type.MethodMetadata) EnvironmentRepositoryFactory(org.springframework.cloud.config.server.environment.EnvironmentRepositoryFactory)

Example 37 with MethodMetadata

use of org.springframework.core.type.MethodMetadata in project spring-cloud-function by spring-cloud.

the class FunctionContextUtils method findType.

public static Type findType(ConfigurableListableBeanFactory registry, String... names) {
    AbstractBeanDefinition definition = null;
    String actualName = null;
    for (String name : names) {
        if (registry.containsBeanDefinition(name)) {
            definition = (AbstractBeanDefinition) registry.getBeanDefinition(name);
            actualName = name;
        } else if (registry.containsBean(name)) {
            return FunctionTypeUtils.discoverFunctionTypeFromClass(registry.getBean(name).getClass());
        }
    }
    if (definition == null) {
        return null;
    } else if (definition instanceof ScannedGenericBeanDefinition) {
        try {
            return FunctionTypeUtils.discoverFunctionTypeFromClass(definition.getBeanClass());
        } catch (Exception e) {
        // ignore since name may not be actually resolved to a class in some cases
        // java.lang.IllegalStateException: Bean class name [functions.Greeter] has not been resolved into an actual Class
        }
    }
    Object source = definition.getSource();
    Type param = null;
    if (source instanceof MethodMetadata) {
        param = findBeanType(definition, ((MethodMetadata) source).getDeclaringClassName(), ((MethodMetadata) source).getMethodName());
    } else if (source instanceof Resource) {
        param = registry.getType(actualName);
    } else {
        ResolvableType type = (ResolvableType) getField(definition, "targetType");
        if (type != null) {
            param = type.getType();
        }
    }
    return param;
}
Also used : Type(java.lang.reflect.Type) ResolvableType(org.springframework.core.ResolvableType) AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) ScannedGenericBeanDefinition(org.springframework.context.annotation.ScannedGenericBeanDefinition) Resource(org.springframework.core.io.Resource) MethodMetadata(org.springframework.core.type.MethodMetadata) ResolvableType(org.springframework.core.ResolvableType)

Example 38 with MethodMetadata

use of org.springframework.core.type.MethodMetadata in project spring-framework by spring-projects.

the class ConfigurationClassParser method retrieveBeanMethodMetadata.

/**
	 * Retrieve the metadata for all <code>@Bean</code> methods.
	 */
private Set<MethodMetadata> retrieveBeanMethodMetadata(SourceClass sourceClass) {
    AnnotationMetadata original = sourceClass.getMetadata();
    Set<MethodMetadata> beanMethods = original.getAnnotatedMethods(Bean.class.getName());
    if (beanMethods.size() > 1 && original instanceof StandardAnnotationMetadata) {
        // order, even between different runs of the same application on the same JVM.
        try {
            AnnotationMetadata asm = this.metadataReaderFactory.getMetadataReader(original.getClassName()).getAnnotationMetadata();
            Set<MethodMetadata> asmMethods = asm.getAnnotatedMethods(Bean.class.getName());
            if (asmMethods.size() >= beanMethods.size()) {
                Set<MethodMetadata> selectedMethods = new LinkedHashSet<>(asmMethods.size());
                for (MethodMetadata asmMethod : asmMethods) {
                    for (MethodMetadata beanMethod : beanMethods) {
                        if (beanMethod.getMethodName().equals(asmMethod.getMethodName())) {
                            selectedMethods.add(beanMethod);
                            break;
                        }
                    }
                }
                if (selectedMethods.size() == beanMethods.size()) {
                    // All reflection-detected methods found in ASM method set -> proceed
                    beanMethods = selectedMethods;
                }
            }
        } catch (IOException ex) {
            logger.debug("Failed to read class file via ASM for determining @Bean method order", ex);
        // No worries, let's continue with the reflection metadata we started with...
        }
    }
    return beanMethods;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) StandardAnnotationMetadata(org.springframework.core.type.StandardAnnotationMetadata) MethodMetadata(org.springframework.core.type.MethodMetadata) IOException(java.io.IOException) NestedIOException(org.springframework.core.NestedIOException) AnnotationMetadata(org.springframework.core.type.AnnotationMetadata) StandardAnnotationMetadata(org.springframework.core.type.StandardAnnotationMetadata)

Example 39 with MethodMetadata

use of org.springframework.core.type.MethodMetadata in project spring-framework by spring-projects.

the class ConfigurationClassParser method processInterfaces.

/**
	 * Register default methods on interfaces implemented by the configuration class.
	 */
private void processInterfaces(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
    for (SourceClass ifc : sourceClass.getInterfaces()) {
        Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(ifc);
        for (MethodMetadata methodMetadata : beanMethods) {
            if (!methodMetadata.isAbstract()) {
                // A default method or other concrete method on a Java 8+ interface...
                configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
            }
        }
        processInterfaces(configClass, ifc);
    }
}
Also used : MethodMetadata(org.springframework.core.type.MethodMetadata)

Example 40 with MethodMetadata

use of org.springframework.core.type.MethodMetadata in project spring-framework by spring-projects.

the class ConfigurationClassParser method doProcessConfigurationClass.

/**
	 * Apply processing and build a complete {@link ConfigurationClass} by reading the
	 * annotations, members and methods from the source class. This method can be called
	 * multiple times as relevant sources are discovered.
	 * @param configClass the configuration class being build
	 * @param sourceClass a source class
	 * @return the superclass, or {@code null} if none found or previously processed
	 */
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
    // Recursively process any member (nested) classes first
    processMemberClasses(configClass, sourceClass);
    // Process any @PropertySource annotations
    for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), PropertySources.class, org.springframework.context.annotation.PropertySource.class)) {
        if (this.environment instanceof ConfigurableEnvironment) {
            processPropertySource(propertySource);
        } else {
            logger.warn("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() + "]. Reason: Environment must implement ConfigurableEnvironment");
        }
    }
    // Process any @ComponentScan annotations
    Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
    if (!componentScans.isEmpty() && !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
        for (AnnotationAttributes componentScan : componentScans) {
            // The config class is annotated with @ComponentScan -> perform the scan immediately
            Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
            // Check the set of scanned definitions for any further config classes and parse recursively if necessary
            for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
                if (ConfigurationClassUtils.checkConfigurationClassCandidate(holder.getBeanDefinition(), this.metadataReaderFactory)) {
                    parse(holder.getBeanDefinition().getBeanClassName(), holder.getBeanName());
                }
            }
        }
    }
    // Process any @Import annotations
    processImports(configClass, sourceClass, getImports(sourceClass), true);
    // Process any @ImportResource annotations
    if (sourceClass.getMetadata().isAnnotated(ImportResource.class.getName())) {
        AnnotationAttributes importResource = AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);
        String[] resources = importResource.getStringArray("locations");
        Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");
        for (String resource : resources) {
            String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);
            configClass.addImportedResource(resolvedResource, readerClass);
        }
    }
    // Process individual @Bean methods
    Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
    for (MethodMetadata methodMetadata : beanMethods) {
        configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
    }
    // Process default methods on interfaces
    processInterfaces(configClass, sourceClass);
    // Process superclass, if any
    if (sourceClass.getMetadata().hasSuperClass()) {
        String superclass = sourceClass.getMetadata().getSuperClassName();
        if (!superclass.startsWith("java") && !this.knownSuperclasses.containsKey(superclass)) {
            this.knownSuperclasses.put(superclass, configClass);
            // Superclass found, return its annotation metadata and recurse
            return sourceClass.getSuperClass();
        }
    }
    // No superclass -> processing is complete
    return null;
}
Also used : AnnotationAttributes(org.springframework.core.annotation.AnnotationAttributes) ConfigurableEnvironment(org.springframework.core.env.ConfigurableEnvironment) BeanDefinitionHolder(org.springframework.beans.factory.config.BeanDefinitionHolder) MethodMetadata(org.springframework.core.type.MethodMetadata)

Aggregations

MethodMetadata (org.springframework.core.type.MethodMetadata)73 AnnotatedBeanDefinition (org.springframework.beans.factory.annotation.AnnotatedBeanDefinition)33 BeanDefinition (org.springframework.beans.factory.config.BeanDefinition)32 AbstractBeanDefinition (org.springframework.beans.factory.support.AbstractBeanDefinition)20 AnnotationMetadata (org.springframework.core.type.AnnotationMetadata)15 StandardMethodMetadata (org.springframework.core.type.StandardMethodMetadata)14 ArrayList (java.util.ArrayList)12 BeanDefinitionHolder (org.springframework.beans.factory.config.BeanDefinitionHolder)12 AnnotationAttributes (org.springframework.core.annotation.AnnotationAttributes)12 RootBeanDefinition (org.springframework.beans.factory.support.RootBeanDefinition)11 Map (java.util.Map)10 StandardAnnotationMetadata (org.springframework.core.type.StandardAnnotationMetadata)10 Method (java.lang.reflect.Method)9 AnnotatedGenericBeanDefinition (org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition)9 BeanDefinitionRegistry (org.springframework.beans.factory.support.BeanDefinitionRegistry)8 Bean (org.springframework.context.annotation.Bean)8 IOException (java.io.IOException)6 HashSet (java.util.HashSet)6 BeanDefinitionBuilder (org.springframework.beans.factory.support.BeanDefinitionBuilder)6 NestedIOException (org.springframework.core.NestedIOException)6