diff --git a/spring-aop/src/test/java/org/springframework/aop/scope/ScopedProxyAutowireTests.java b/spring-aop/src/test/java/org/springframework/aop/scope/ScopedProxyAutowireTests.java
index d13676c5e48..4b5634f2b0a 100644
--- a/spring-aop/src/test/java/org/springframework/aop/scope/ScopedProxyAutowireTests.java
+++ b/spring-aop/src/test/java/org/springframework/aop/scope/ScopedProxyAutowireTests.java
@@ -29,15 +29,15 @@ import static org.springframework.tests.TestResourceUtils.*;
/**
* @author Mark Fisher
- * @author Chris Beams
* @author Juergen Hoeller
+ * @author Chris Beams
*/
public class ScopedProxyAutowireTests {
- private static final Class> CLASS = ScopedProxyAutowireTests.class;
-
- private static final Resource SCOPED_AUTOWIRE_TRUE_CONTEXT = qualifiedResource(CLASS, "scopedAutowireTrue.xml");
- private static final Resource SCOPED_AUTOWIRE_FALSE_CONTEXT = qualifiedResource(CLASS, "scopedAutowireFalse.xml");
+ private static final Resource SCOPED_AUTOWIRE_FALSE_CONTEXT =
+ qualifiedResource(ScopedProxyAutowireTests.class, "scopedAutowireFalse.xml");
+ private static final Resource SCOPED_AUTOWIRE_TRUE_CONTEXT =
+ qualifiedResource(ScopedProxyAutowireTests.class, "scopedAutowireTrue.xml");
@Test
@@ -45,6 +45,8 @@ public class ScopedProxyAutowireTests {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(SCOPED_AUTOWIRE_FALSE_CONTEXT);
assertTrue(Arrays.asList(bf.getBeanNamesForType(TestBean.class, false, false)).contains("scoped"));
+ assertTrue(Arrays.asList(bf.getBeanNamesForType(TestBean.class, true, false)).contains("scoped"));
+ assertFalse(bf.containsSingleton("scoped"));
TestBean autowired = (TestBean) bf.getBean("autowired");
TestBean unscoped = (TestBean) bf.getBean("unscoped");
assertSame(unscoped, autowired.getChild());
@@ -54,7 +56,9 @@ public class ScopedProxyAutowireTests {
public void testScopedProxyReplacesAutowireCandidateTrue() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(SCOPED_AUTOWIRE_TRUE_CONTEXT);
+ assertTrue(Arrays.asList(bf.getBeanNamesForType(TestBean.class, true, false)).contains("scoped"));
assertTrue(Arrays.asList(bf.getBeanNamesForType(TestBean.class, false, false)).contains("scoped"));
+ assertFalse(bf.containsSingleton("scoped"));
TestBean autowired = (TestBean) bf.getBean("autowired");
TestBean scoped = (TestBean) bf.getBean("scoped");
assertSame(scoped, autowired.getChild());
diff --git a/spring-aop/src/test/resources/org/springframework/aop/config/TopLevelAopTagTests-context.xml b/spring-aop/src/test/resources/org/springframework/aop/config/TopLevelAopTagTests-context.xml
index 6c9e44b560f..f1fff08fa4a 100644
--- a/spring-aop/src/test/resources/org/springframework/aop/config/TopLevelAopTagTests-context.xml
+++ b/spring-aop/src/test/resources/org/springframework/aop/config/TopLevelAopTagTests-context.xml
@@ -1,6 +1,6 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
@@ -9,4 +9,4 @@
-
\ No newline at end of file
+
diff --git a/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireFalse.xml b/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireFalse.xml
index feecab3e9cf..5cb859c8c09 100644
--- a/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireFalse.xml
+++ b/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireFalse.xml
@@ -1,16 +1,16 @@
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
-
-
-
+
+
+
-
+
-
+
diff --git a/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireTrue.xml b/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireTrue.xml
index 445b50d064b..22c62644dd8 100644
--- a/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireTrue.xml
+++ b/spring-aop/src/test/resources/org/springframework/aop/scope/ScopedProxyAutowireTests-scopedAutowireTrue.xml
@@ -1,16 +1,16 @@
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
-
-
-
+
+
+
-
+
-
+
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
index 83448499883..b4e29ec6f8f 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
@@ -423,10 +423,12 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
!requiresEagerInitForType(mbd.getFactoryBeanName()))) {
// In case of FactoryBean, match object created by FactoryBean.
boolean isFactoryBean = isFactoryBean(beanName, mbd);
- boolean matchFound = (allowEagerInit || !isFactoryBean ||
- (mbd.getDecoratedDefinition() != null && !mbd.isLazyInit()) ||
- containsSingleton(beanName)) &&
- (includeNonSingletons || isSingleton(beanName)) &&
+ BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();
+ boolean matchFound =
+ (allowEagerInit || !isFactoryBean ||
+ (dbd != null && !mbd.isLazyInit()) || containsSingleton(beanName)) &&
+ (includeNonSingletons ||
+ (dbd != null ? mbd.isSingleton() : isSingleton(beanName))) &&
isTypeMatch(beanName, type);
if (!matchFound && isFactoryBean) {
// In case of FactoryBean, try to match FactoryBean instance itself next.
diff --git a/spring-context/src/test/java/org/springframework/context/annotation/Spr15042Tests.java b/spring-context/src/test/java/org/springframework/context/annotation/Spr15042Tests.java
new file mode 100644
index 00000000000..a54c215161f
--- /dev/null
+++ b/spring-context/src/test/java/org/springframework/context/annotation/Spr15042Tests.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.context.annotation;
+
+import org.junit.Test;
+
+import org.springframework.aop.framework.ProxyFactoryBean;
+import org.springframework.aop.target.CommonsPool2TargetSource;
+
+/**
+ * @author Juergen Hoeller
+ */
+public class Spr15042Tests {
+
+ @Test
+ public void poolingTargetSource() {
+ new AnnotationConfigApplicationContext(PoolingTargetSourceConfig.class);
+ }
+
+
+ @Configuration
+ static class PoolingTargetSourceConfig {
+
+ @Bean
+ @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
+ public ProxyFactoryBean myObject() {
+ ProxyFactoryBean pfb = new ProxyFactoryBean();
+ pfb.setTargetSource(poolTargetSource());
+ return pfb;
+ }
+
+ @Bean
+ public CommonsPool2TargetSource poolTargetSource() {
+ CommonsPool2TargetSource pool = new CommonsPool2TargetSource();
+ pool.setMaxSize(3);
+ pool.setTargetBeanName("myObjectTarget");
+ return pool;
+ }
+
+ @Bean(name = "myObjectTarget")
+ @Scope(scopeName = "prototype")
+ public Object myObjectTarget() {
+ return new Object();
+ }
+ }
+
+}