ScheduledAnnotationBeanPostProcessor properly deals with nested proxies
Issue: SPR-16196
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2017 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -32,6 +32,7 @@ import java.util.concurrent.ScheduledExecutorService;
|
|||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import org.springframework.aop.framework.AopProxyUtils;
|
||||||
import org.springframework.aop.support.AopUtils;
|
import org.springframework.aop.support.AopUtils;
|
||||||
import org.springframework.beans.factory.BeanFactory;
|
import org.springframework.beans.factory.BeanFactory;
|
||||||
import org.springframework.beans.factory.BeanFactoryAware;
|
import org.springframework.beans.factory.BeanFactoryAware;
|
||||||
@@ -311,7 +312,7 @@ public class ScheduledAnnotationBeanPostProcessor
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object postProcessAfterInitialization(final Object bean, String beanName) {
|
public Object postProcessAfterInitialization(final Object bean, String beanName) {
|
||||||
Class<?> targetClass = AopUtils.getTargetClass(bean);
|
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(bean);
|
||||||
if (!this.nonAnnotatedClasses.contains(targetClass)) {
|
if (!this.nonAnnotatedClasses.contains(targetClass)) {
|
||||||
Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
|
Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
|
||||||
(MethodIntrospector.MetadataLookup<Set<Scheduled>>) method -> {
|
(MethodIntrospector.MetadataLookup<Set<Scheduled>>) method -> {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -33,6 +33,7 @@ import java.util.TimeZone;
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.aop.framework.ProxyFactory;
|
||||||
import org.springframework.beans.DirectFieldAccessor;
|
import org.springframework.beans.DirectFieldAccessor;
|
||||||
import org.springframework.beans.factory.BeanCreationException;
|
import org.springframework.beans.factory.BeanCreationException;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
@@ -179,6 +180,14 @@ public class ScheduledAnnotationBeanPostProcessorTests {
|
|||||||
severalFixedRates(context, processorDefinition, targetDefinition);
|
severalFixedRates(context, processorDefinition, targetDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void severalFixedRatesAgainstNestedCglibProxy() {
|
||||||
|
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);
|
||||||
|
BeanDefinition targetDefinition = new RootBeanDefinition(SeveralFixedRatesWithRepeatedScheduledAnnotationTestBean.class);
|
||||||
|
targetDefinition.setFactoryMethodName("nestedProxy");
|
||||||
|
severalFixedRates(context, processorDefinition, targetDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
private void severalFixedRates(StaticApplicationContext context,
|
private void severalFixedRates(StaticApplicationContext context,
|
||||||
BeanDefinition processorDefinition, BeanDefinition targetDefinition) {
|
BeanDefinition processorDefinition, BeanDefinition targetDefinition) {
|
||||||
|
|
||||||
@@ -631,6 +640,14 @@ public class ScheduledAnnotationBeanPostProcessorTests {
|
|||||||
@Scheduled(fixedRate = 4000, initialDelay = 2000)
|
@Scheduled(fixedRate = 4000, initialDelay = 2000)
|
||||||
public void fixedRate() {
|
public void fixedRate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SeveralFixedRatesWithRepeatedScheduledAnnotationTestBean nestedProxy() {
|
||||||
|
ProxyFactory pf1 = new ProxyFactory(new SeveralFixedRatesWithRepeatedScheduledAnnotationTestBean());
|
||||||
|
pf1.setProxyTargetClass(true);
|
||||||
|
ProxyFactory pf2 = new ProxyFactory(pf1.getProxy());
|
||||||
|
pf2.setProxyTargetClass(true);
|
||||||
|
return (SeveralFixedRatesWithRepeatedScheduledAnnotationTestBean) pf2.getProxy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user