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(); + } + } + +}