Package org.springframework.context.annotation

Source Code of org.springframework.context.annotation.AnnotationConfigUtils

/*
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springframework.context.annotation;

import java.util.LinkedHashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.util.ClassUtils;

/**
* Utility class that allows for convenient registration of common
* {@link org.springframework.beans.factory.config.BeanPostProcessor} and
* {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor}
* definitions for annotation-based configuration.
*
* @author Mark Fisher
* @author Juergen Hoeller
* @author Chris Beams
* @since 2.5
* @see CommonAnnotationBeanPostProcessor
* @see org.springframework.context.annotation.ConfigurationClassPostProcessor
* @see org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
* @see org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
* @see org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
*/
public class AnnotationConfigUtils {

  /**
   * The bean name of the internally managed Configuration annotation processor.
   */
  public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalConfigurationAnnotationProcessor";

  /**
   * The bean name of the internally managed Autowired annotation processor.
   */
  public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalAutowiredAnnotationProcessor";

  /**
   * The bean name of the internally managed Required annotation processor.
   */
  public static final String REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalRequiredAnnotationProcessor";

  /**
   * The bean name of the internally managed JSR-250 annotation processor.
   */
  public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalCommonAnnotationProcessor";

  /**
   * The bean name of the internally managed Scheduled annotation processor.
   */
  public static final String SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalScheduledAnnotationProcessor";

  /**
   * The bean name of the internally managed Async annotation processor.
   */
  public static final String ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalAsyncAnnotationProcessor";

  /**
   * The bean name of the internally managed AspectJ async execution aspect.
   */
  public static final String ASYNC_EXECUTION_ASPECT_BEAN_NAME =
      "org.springframework.scheduling.config.internalAsyncExecutionAspect";

  /**
   * The class name of the AspectJ async execution aspect.
   */
  public static final String ASYNC_EXECUTION_ASPECT_CLASS_NAME =
      "org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect";

  /**
   * The name of the AspectJ async execution aspect @{@code Configuration} class.
   */
  public static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
      "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";

  /**
   * The bean name of the internally managed cache advisor.
   */
  public static final String CACHE_ADVISOR_BEAN_NAME =
      "org.springframework.cache.config.internalCacheAdvisor";

  /**
   * The bean name of the internally managed cache aspect.
   */
  public static final String CACHE_ASPECT_BEAN_NAME =
      "org.springframework.cache.config.internalCacheAspect";

  /**
   * The class name of the AspectJ caching aspect.
   */
  public static final String CACHE_ASPECT_CLASS_NAME =
      "org.springframework.cache.aspectj.AnnotationCacheAspect";

  /**
   * The name of the AspectJ caching aspect @{@code Configuration} class.
   */
  public static final String CACHE_ASPECT_CONFIGURATION_CLASS_NAME =
      "org.springframework.cache.aspectj.AspectJCachingConfiguration";

  /**
   * The bean name of the internally managed JPA annotation processor.
   */
  public static final String PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME =
      "org.springframework.context.annotation.internalPersistenceAnnotationProcessor";


  private static final String PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME =
      "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor";


  private static final boolean jsr250Present =
      ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());

  private static final boolean jpaPresent =
      ClassUtils.isPresent("javax.persistence.EntityManagerFactory", AnnotationConfigUtils.class.getClassLoader()) &&
      ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader());


  /**
   * Register all relevant annotation post processors in the given registry.
   * @param registry the registry to operate on
   */
  public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
    registerAnnotationConfigProcessors(registry, null);
  }

  /**
   * Register all relevant annotation post processors in the given registry.
   * @param registry the registry to operate on
   * @param source the configuration source element (already extracted)
   * that this registration was triggered from. May be <code>null</code>.
   * @return a Set of BeanDefinitionHolders, containing all bean definitions
   * that have actually been registered by this call
   */
  public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
      BeanDefinitionRegistry registry, Object source) {

    Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);

    if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
    if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
    if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition();
      try {
        ClassLoader cl = AnnotationConfigUtils.class.getClassLoader();
        def.setBeanClass(cl.loadClass(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME));
      }
      catch (ClassNotFoundException ex) {
        throw new IllegalStateException(
            "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
      }
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    return beanDefs;
  }

  private static BeanDefinitionHolder registerPostProcessor(
      BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {

    definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
    registry.registerBeanDefinition(beanName, definition);
    return new BeanDefinitionHolder(definition, beanName);
  }

  static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd) {
    if (abd.getMetadata().isAnnotated(Primary.class.getName())) {
      abd.setPrimary(true);
    }
    if (abd.getMetadata().isAnnotated(Lazy.class.getName())) {
      Boolean value = (Boolean) abd.getMetadata().getAnnotationAttributes(Lazy.class.getName()).get("value");
      abd.setLazyInit(value);
    }
    if (abd.getMetadata().isAnnotated(DependsOn.class.getName())) {
      String[] value = (String[]) abd.getMetadata().getAnnotationAttributes(DependsOn.class.getName()).get("value");
      abd.setDependsOn(value);
    }
    if (abd instanceof AbstractBeanDefinition) {
      if (abd.getMetadata().isAnnotated(Role.class.getName())) {
        int value = (Integer) abd.getMetadata().getAnnotationAttributes(Role.class.getName()).get("value");
        ((AbstractBeanDefinition)abd).setRole(value);
      }
    }
  }

  static BeanDefinitionHolder applyScopedProxyMode(
      ScopeMetadata metadata, BeanDefinitionHolder definition, BeanDefinitionRegistry registry) {

    ScopedProxyMode scopedProxyMode = metadata.getScopedProxyMode();
    if (scopedProxyMode.equals(ScopedProxyMode.NO)) {
      return definition;
    }
    boolean proxyTargetClass = scopedProxyMode.equals(ScopedProxyMode.TARGET_CLASS);
    return ScopedProxyCreator.createScopedProxy(definition, registry, proxyTargetClass);
  }

}
TOP

Related Classes of org.springframework.context.annotation.AnnotationConfigUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.