Fix cache annotation tip
Even if using cglib proxy mode, annotations on an interface can be recognized. Signed-off-by: Kwangyong Kim <banana.yong@gmail.com>
This commit is contained in:
parent
2fb3f9993f
commit
ceea00f733
|
@ -73,6 +73,19 @@ public class EnableCachingIntegrationTests {
|
||||||
fooGetSimple(service);
|
fooGetSimple(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void barServiceWithCacheableInterfaceCglib() {
|
||||||
|
this.context = new AnnotationConfigApplicationContext(BarConfigCglib.class);
|
||||||
|
BarService service = this.context.getBean(BarService.class);
|
||||||
|
Cache cache = getCache();
|
||||||
|
|
||||||
|
Object key = new Object();
|
||||||
|
assertCacheMiss(key, cache);
|
||||||
|
|
||||||
|
Object value = service.getSimple(key);
|
||||||
|
assertCacheHit(key, value, cache);
|
||||||
|
}
|
||||||
|
|
||||||
private void fooGetSimple(FooService service) {
|
private void fooGetSimple(FooService service) {
|
||||||
Cache cache = getCache();
|
Cache cache = getCache();
|
||||||
|
|
||||||
|
@ -184,6 +197,31 @@ public class EnableCachingIntegrationTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@Import(SharedConfig.class)
|
||||||
|
@EnableCaching(proxyTargetClass = true)
|
||||||
|
static class BarConfigCglib {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public BarService barService() {
|
||||||
|
return new BarServiceImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BarService {
|
||||||
|
@Cacheable(cacheNames = "testCache")
|
||||||
|
Object getSimple(Object key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class BarServiceImpl implements BarService {
|
||||||
|
|
||||||
|
private final AtomicLong counter = new AtomicLong();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getSimple(Object key) {
|
||||||
|
return this.counter.getAndIncrement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@Import(FooConfig.class)
|
@Import(FooConfig.class)
|
||||||
|
|
|
@ -6226,11 +6226,9 @@ if you need to annotate non-public methods, as it changes the bytecode itself.
|
||||||
TIP: Spring recommends that you only annotate concrete classes (and methods of concrete
|
TIP: Spring recommends that you only annotate concrete classes (and methods of concrete
|
||||||
classes) with the `@Cache{asterisk}` annotation, as opposed to annotating interfaces.
|
classes) with the `@Cache{asterisk}` annotation, as opposed to annotating interfaces.
|
||||||
You certainly can place the `@Cache{asterisk}` annotation on an interface (or an interface
|
You certainly can place the `@Cache{asterisk}` annotation on an interface (or an interface
|
||||||
method), but this works only as you would expect it to if you use interface-based proxies.
|
method), but this works only as you would expect it to if you use the proxy mode (`mode="proxy"`).
|
||||||
The fact that Java annotations are not inherited from interfaces means that, if you use
|
If you use the weaving-based aspect (`mode="aspectj"`), the caching settings are not
|
||||||
class-based proxies (`proxy-target-class="true"`) or the weaving-based aspect
|
recognized by weaving infrastructure.
|
||||||
(`mode="aspectj"`), the caching settings are not recognized by the proxying and weaving
|
|
||||||
infrastructure, and the object is not wrapped in a caching proxy.
|
|
||||||
|
|
||||||
NOTE: In proxy mode (the default), only external method calls coming in through the
|
NOTE: In proxy mode (the default), only external method calls coming in through the
|
||||||
proxy are intercepted. This means that self-invocation (in effect, a method within the
|
proxy are intercepted. This means that self-invocation (in effect, a method within the
|
||||||
|
|
Loading…
Reference in New Issue