Example usage for org.springframework.context.annotation AdviceMode PROXY

List of usage examples for org.springframework.context.annotation AdviceMode PROXY

Introduction

In this page you can find the example usage for org.springframework.context.annotation AdviceMode PROXY.

Prototype

AdviceMode PROXY

To view the source code for org.springframework.context.annotation AdviceMode PROXY.

Click Source Link

Document

JDK proxy-based advice.

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  av  a  2 s.  c  o m*/
 * <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));
    }
}