Example usage for org.springframework.aop.config AopConfigUtils forceAutoProxyCreatorToUseClassProxying

List of usage examples for org.springframework.aop.config AopConfigUtils forceAutoProxyCreatorToUseClassProxying

Introduction

In this page you can find the example usage for org.springframework.aop.config AopConfigUtils forceAutoProxyCreatorToUseClassProxying.

Prototype

public static void forceAutoProxyCreatorToUseClassProxying(BeanDefinitionRegistry registry) 

Source Link

Usage

From source file:org.springframework.context.annotation.AutoProxyRegistrar.java

/**
 * Register, escalate, and configure the standard auto proxy creator (APC) against the
 * given registry. Works by finding the nearest annotation declared on the importing
 * {@code @Configuration} class that has both {@code mode} and {@code proxyTargetClass}
 * attributes. If {@code mode} is set to {@code PROXY}, the APC is registered; if
 * {@code proxyTargetClass} is set to {@code true}, then the APC is forced to use
 * subclass (CGLIB) proxying.// w  ww .  j  ava  2 s. c om
 * <p>Several {@code @Enable*} annotations expose both {@code mode} and
 * {@code proxyTargetClass} attributes. It is important to note that most of these
 * capabilities end up sharing a {@linkplain AopConfigUtils#AUTO_PROXY_CREATOR_BEAN_NAME
 * single APC}. For this reason, this implementation doesn't "care" exactly which
 * annotation it finds -- as long as it exposes the right {@code mode} and
 * {@code proxyTargetClass} attributes, the APC can be registered and configured all
 * the same.
 */
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
        BeanDefinitionRegistry registry) {
    boolean candidateFound = false;
    Set<String> annoTypes = importingClassMetadata.getAnnotationTypes();
    for (String annoType : annoTypes) {
        AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annoType);
        if (candidate == null) {
            continue;
        }
        Object mode = candidate.get("mode");
        Object proxyTargetClass = candidate.get("proxyTargetClass");
        if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass()
                && Boolean.class == proxyTargetClass.getClass()) {
            candidateFound = true;
            if (mode == AdviceMode.PROXY) {
                AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
                if ((Boolean) proxyTargetClass) {
                    AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
                    return;
                }
            }
        }
    }
    if (!candidateFound) {
        String name = getClass().getSimpleName();
        logger.warn(String.format(
                "%s was imported but no annotations were found "
                        + "having both 'mode' and 'proxyTargetClass' attributes of type "
                        + "AdviceMode and boolean respectively. This means that auto proxy "
                        + "creator registration and configuration may not have occurred as "
                        + "intended, and components may not be proxied as expected. Check to "
                        + "ensure that %s has been @Import'ed on the same class where these "
                        + "annotations are declared; otherwise remove the import of %s " + "altogether.",
                name, name, name));
    }
}