提交 c7100f77 编写于 作者: J Juergen Hoeller

Explicit notes on advice mode proxy vs aspectj

Issue: SPR-16092
上级 75ec973b
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -148,15 +148,19 @@ import org.springframework.core.Ordered; ...@@ -148,15 +148,19 @@ import org.springframework.core.Ordered;
* can be useful if you do not need to customize everything. See {@link CachingConfigurer} * can be useful if you do not need to customize everything. See {@link CachingConfigurer}
* Javadoc for further details. * Javadoc for further details.
* *
* <p>The {@link #mode()} attribute controls how advice is applied; if the mode is * <p>The {@link #mode} attribute controls how advice is applied: If the mode is
* {@link AdviceMode#PROXY} (the default), then the other attributes such as * {@link AdviceMode#PROXY} (the default), then the other attributes control the behavior
* {@link #proxyTargetClass()} control the behavior of the proxying. * of the proxying. Please note that proxy mode allows for interception of calls through
* the proxy only; local calls within the same class cannot get intercepted that way.
* *
* <p>If the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the * <p>Note that if the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the
* {@link #proxyTargetClass()} attribute is obsolete. Note also that in this case the * value of the {@link #proxyTargetClass} attribute will be ignored. Note also that in
* {@code spring-aspects} module JAR must be present on the classpath. * this case the {@code spring-aspects} module JAR must be present on the classpath, with
* compile-time weaving or load-time weaving applying the aspect to the affected classes.
* There is no proxy involved in such a scenario; local calls will be intercepted as well.
* *
* @author Chris Beams * @author Chris Beams
* @author Juergen Hoeller
* @since 3.1 * @since 3.1
* @see CachingConfigurer * @see CachingConfigurer
* @see CachingConfigurationSelector * @see CachingConfigurationSelector
...@@ -183,16 +187,21 @@ public @interface EnableCaching { ...@@ -183,16 +187,21 @@ public @interface EnableCaching {
boolean proxyTargetClass() default false; boolean proxyTargetClass() default false;
/** /**
* Indicate how caching advice should be applied. The default is * Indicate how caching advice should be applied.
* {@link AdviceMode#PROXY}. * <p><b>The default is {@link AdviceMode#PROXY}.</b>
* @see AdviceMode * Please note that proxy mode allows for interception of calls through the proxy
* only. Local calls within the same class cannot get intercepted that way;
* a caching annotation on such a method within a local call will be ignored
* since Spring's interceptor does not even kick in for such a runtime scenario.
* For a more advanced mode of interception, consider switching this to
* {@link AdviceMode#ASPECTJ}.
*/ */
AdviceMode mode() default AdviceMode.PROXY; AdviceMode mode() default AdviceMode.PROXY;
/** /**
* Indicate the ordering of the execution of the caching advisor * Indicate the ordering of the execution of the caching advisor
* when multiple advices are applied at a specific joinpoint. * when multiple advices are applied at a specific joinpoint.
* The default is {@link Ordered#LOWEST_PRECEDENCE}. * <p>The default is {@link Ordered#LOWEST_PRECEDENCE}.
*/ */
int order() default Ordered.LOWEST_PRECEDENCE; int order() default Ordered.LOWEST_PRECEDENCE;
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -58,14 +58,6 @@ import org.springframework.core.Ordered; ...@@ -58,14 +58,6 @@ import org.springframework.core.Ordered;
* } * }
* }</pre> * }</pre>
* *
* <p>The {@link #mode} attribute controls how advice is applied; if the mode is
* {@link AdviceMode#PROXY} (the default), then the other attributes control the behavior
* of the proxying.
*
* <p>Note that if the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the
* value of the {@link #proxyTargetClass} attribute will be ignored. Note also that in
* this case the {@code spring-aspects} module JAR must be present on the classpath.
*
* <p>By default, Spring will be searching for an associated thread pool definition: * <p>By default, Spring will be searching for an associated thread pool definition:
* either a unique {@link org.springframework.core.task.TaskExecutor} bean in the context, * either a unique {@link org.springframework.core.task.TaskExecutor} bean in the context,
* or an {@link java.util.concurrent.Executor} bean named "taskExecutor" otherwise. If * or an {@link java.util.concurrent.Executor} bean named "taskExecutor" otherwise. If
...@@ -140,6 +132,17 @@ import org.springframework.core.Ordered; ...@@ -140,6 +132,17 @@ import org.springframework.core.Ordered;
* demonstrates how the JavaConfig-based approach allows for maximum configurability * demonstrates how the JavaConfig-based approach allows for maximum configurability
* through direct access to actual componentry. * through direct access to actual componentry.
* *
* <p>The {@link #mode} attribute controls how advice is applied: If the mode is
* {@link AdviceMode#PROXY} (the default), then the other attributes control the behavior
* of the proxying. Please note that proxy mode allows for interception of calls through
* the proxy only; local calls within the same class cannot get intercepted that way.
*
* <p>Note that if the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the
* value of the {@link #proxyTargetClass} attribute will be ignored. Note also that in
* this case the {@code spring-aspects} module JAR must be present on the classpath, with
* compile-time weaving or load-time weaving applying the aspect to the affected classes.
* There is no proxy involved in such a scenario; local calls will be intercepted as well.
*
* @author Chris Beams * @author Chris Beams
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Stephane Nicoll * @author Stephane Nicoll
...@@ -182,8 +185,13 @@ public @interface EnableAsync { ...@@ -182,8 +185,13 @@ public @interface EnableAsync {
/** /**
* Indicate how async advice should be applied. * Indicate how async advice should be applied.
* <p>The default is {@link AdviceMode#PROXY}. * <p><b>The default is {@link AdviceMode#PROXY}.</b>
* @see AdviceMode * Please note that proxy mode allows for interception of calls through the proxy
* only. Local calls within the same class cannot get intercepted that way; an
* {@link Async} annotation on such a method within a local call will be ignored
* since Spring's interceptor does not even kick in for such a runtime scenario.
* For a more advanced mode of interception, consider switching this to
* {@link AdviceMode#ASPECTJ}.
*/ */
AdviceMode mode() default AdviceMode.PROXY; AdviceMode mode() default AdviceMode.PROXY;
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -131,15 +131,19 @@ import org.springframework.core.Ordered; ...@@ -131,15 +131,19 @@ import org.springframework.core.Ordered;
* {@code @Transactional} methods. See {@link TransactionManagementConfigurer} Javadoc * {@code @Transactional} methods. See {@link TransactionManagementConfigurer} Javadoc
* for further details. * for further details.
* *
* <p>The {@link #mode()} attribute controls how advice is applied; if the mode is * <p>The {@link #mode} attribute controls how advice is applied: If the mode is
* {@link AdviceMode#PROXY} (the default), then the other attributes control the behavior * {@link AdviceMode#PROXY} (the default), then the other attributes control the behavior
* of the proxying. * of the proxying. Please note that proxy mode allows for interception of calls through
* the proxy only; local calls within the same class cannot get intercepted that way.
* *
* <p>If the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the * <p>Note that if the {@linkplain #mode} is set to {@link AdviceMode#ASPECTJ}, then the
* {@link #proxyTargetClass()} attribute is obsolete. Note also that in this case the * value of the {@link #proxyTargetClass} attribute will be ignored. Note also that in
* {@code spring-aspects} module JAR must be present on the classpath. * this case the {@code spring-aspects} module JAR must be present on the classpath, with
* compile-time weaving or load-time weaving applying the aspect to the affected classes.
* There is no proxy involved in such a scenario; local calls will be intercepted as well.
* *
* @author Chris Beams * @author Chris Beams
* @author Juergen Hoeller
* @since 3.1 * @since 3.1
* @see TransactionManagementConfigurer * @see TransactionManagementConfigurer
* @see TransactionManagementConfigurationSelector * @see TransactionManagementConfigurationSelector
...@@ -167,16 +171,21 @@ public @interface EnableTransactionManagement { ...@@ -167,16 +171,21 @@ public @interface EnableTransactionManagement {
boolean proxyTargetClass() default false; boolean proxyTargetClass() default false;
/** /**
* Indicate how transactional advice should be applied. The default is * Indicate how transactional advice should be applied.
* {@link AdviceMode#PROXY}. * <p><b>The default is {@link AdviceMode#PROXY}.</b>
* @see AdviceMode * Please note that proxy mode allows for interception of calls through the proxy
* only. Local calls within the same class cannot get intercepted that way; an
* {@link Transactional} annotation on such a method within a local call will be
* ignored since Spring's interceptor does not even kick in for such a runtime
* scenario. For a more advanced mode of interception, consider switching this to
* {@link AdviceMode#ASPECTJ}.
*/ */
AdviceMode mode() default AdviceMode.PROXY; AdviceMode mode() default AdviceMode.PROXY;
/** /**
* Indicate the ordering of the execution of the transaction advisor * Indicate the ordering of the execution of the transaction advisor
* when multiple advices are applied at a specific joinpoint. * when multiple advices are applied at a specific joinpoint.
* The default is {@link Ordered#LOWEST_PRECEDENCE}. * <p>The default is {@link Ordered#LOWEST_PRECEDENCE}.
*/ */
int order() default Ordered.LOWEST_PRECEDENCE; int order() default Ordered.LOWEST_PRECEDENCE;
......
...@@ -1225,6 +1225,14 @@ any kind of method. ...@@ -1225,6 +1225,14 @@ any kind of method.
No specified ordering means that the AOP subsystem determines the order of the advice. No specified ordering means that the AOP subsystem determines the order of the advice.
|=== |===
[NOTE]
====
The default advice mode for processing `@Transactional` annotations is "proxy" which
allows for interception of calls through the proxy only; local calls within the same
class cannot get intercepted that way. For a more advanced mode of interception,
consider switching to "aspectj" mode in combination with compile/load-time weaving.
====
[NOTE] [NOTE]
==== ====
The `proxy-target-class` attribute controls what type of transactional proxies are The `proxy-target-class` attribute controls what type of transactional proxies are
......
...@@ -6250,6 +6250,14 @@ Notice with the above XML that an executor reference is provided for handling th ...@@ -6250,6 +6250,14 @@ Notice with the above XML that an executor reference is provided for handling th
tasks that correspond to methods with the `@Async` annotation, and the scheduler tasks that correspond to methods with the `@Async` annotation, and the scheduler
reference is provided for managing those methods annotated with `@Scheduled`. reference is provided for managing those methods annotated with `@Scheduled`.
[NOTE]
====
The default advice mode for processing `@Async` annotations is "proxy" which allows
for interception of calls through the proxy only; local calls within the same class
cannot get intercepted that way. For a more advanced mode of interception, consider
switching to "aspectj" mode in combination with compile-time or load-time weaving.
====
[[scheduling-annotation-support-scheduled]] [[scheduling-annotation-support-scheduled]]
==== The @Scheduled annotation ==== The @Scheduled annotation
...@@ -8313,8 +8321,16 @@ application through AOP. The configuration is intentionally similar with that of ...@@ -8313,8 +8321,16 @@ application through AOP. The configuration is intentionally similar with that of
[NOTE] [NOTE]
==== ====
Advanced customizations using Java config require to implement `CachingConfigurer`, refer The default advice mode for processing caching annotations is "proxy" which allows
to {api-spring-framework}/cache/annotation/CachingConfigurer.html[the for interception of calls through the proxy only; local calls within the same class
cannot get intercepted that way. For a more advanced mode of interception, consider
switching to "aspectj" mode in combination with compile-time or load-time weaving.
====
[NOTE]
====
Advanced customizations using Java config require to implement `CachingConfigurer`:
Please refer to {api-spring-framework}/cache/annotation/CachingConfigurer.html[the
javadoc for more details]. javadoc for more details].
==== ====
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册