diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java index 054cf4d6dcd..0035107d336 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java @@ -358,10 +358,15 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean } } for (Method method : targetClass.getDeclaredMethods()) { + AnnotationAttributes ann = null; Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); - AnnotationAttributes annotation = BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod) ? - findAutowiredAnnotation(bridgedMethod) : findAutowiredAnnotation(method); - if (annotation != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { + if (BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { + ann = findAutowiredAnnotation(bridgedMethod); + } + else if (!method.isBridge()) { + ann = findAutowiredAnnotation(method); + } + if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { if (Modifier.isStatic(method.getModifiers())) { if (logger.isWarnEnabled()) { logger.warn("Autowired annotation is not supported on static methods: " + method); @@ -373,7 +378,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean logger.warn("Autowired annotation should be used on methods with actual parameters: " + method); } } - boolean required = determineRequiredStatus(annotation); + boolean required = determineRequiredStatus(ann); PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method); currElements.add(new AutowiredMethodElement(method, required, pd)); } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index d06d1e522d6..869c2cb02ec 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -26,6 +26,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; import org.junit.Test; import org.mockito.Mockito; @@ -1734,6 +1735,18 @@ public class AutowiredAnnotationBeanPostProcessorTests { assertSame(bf.getBean(StockMovementDaoImpl.class), service.stockMovementDao); } + @Test + public void testBridgeMethodHandling() { + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); + bpp.setBeanFactory(bf); + bf.addBeanPostProcessor(bpp); + bf.registerBeanDefinition("bean1", new RootBeanDefinition(MyCallable.class)); + bf.registerBeanDefinition("bean2", new RootBeanDefinition(SecondCallable.class)); + bf.registerBeanDefinition("bean3", new RootBeanDefinition(FooBar.class)); + assertNotNull(bf.getBean(FooBar.class)); + } + public static class ResourceInjectionBean { @@ -2729,4 +2742,45 @@ public class AutowiredAnnotationBeanPostProcessorTests { private StockMovementDao stockMovementDao; } + + public static class MyCallable implements Callable { + + @Override + public Thread call() throws Exception { + return null; + } + } + + + public static class SecondCallable implements Callable{ + + @Override + public Thread call() throws Exception { + return null; + } + } + + + public static abstract class Foo> { + + private RT obj; + + protected void setObj(RT obj) { + if (this.obj != null) { + throw new IllegalStateException("Already called"); + } + this.obj = obj; + } + } + + + public static class FooBar extends Foo { + + @Override + @Autowired + public void setObj(MyCallable obj) { + super.setObj(obj); + } + } + } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java index 9def582587d..7647a6cabe8 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java @@ -402,7 +402,7 @@ public class PersistenceAnnotationBeanPostProcessor for (Method method : targetClass.getDeclaredMethods()) { PersistenceContext pc = method.getAnnotation(PersistenceContext.class); PersistenceUnit pu = method.getAnnotation(PersistenceUnit.class); - if ((pc != null || pu != null) && + if ((pc != null || pu != null) && !method.isBridge() && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { if (Modifier.isStatic(method.getModifiers())) { throw new IllegalStateException("Persistence annotations are not supported on static methods");