@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2014 the original author or authors .
* Copyright 2002 - 2015 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 .
@ -19,13 +19,17 @@ package org.springframework.context.annotation;
@@ -19,13 +19,17 @@ package org.springframework.context.annotation;
import org.junit.Test ;
import org.springframework.beans.factory.FactoryBean ;
import org.springframework.beans.factory.InitializingBean ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.util.Assert ;
import static org.junit.Assert.* ;
/ * *
* Tests cornering bug SPR - 8514 .
*
* @author Chris Beams
* @author Juergen Hoeller
* @since 3 . 1
* /
public class ConfigurationWithFactoryBeanAndAutowiringTests {
@ -77,138 +81,188 @@ public class ConfigurationWithFactoryBeanAndAutowiringTests {
@@ -77,138 +81,188 @@ public class ConfigurationWithFactoryBeanAndAutowiringTests {
ctx . register ( WildcardParameterizedFactoryBeanInterfaceConfig . class ) ;
ctx . refresh ( ) ;
}
}
class DummyBean {
}
@Test
public void withFactoryBeanCallingBean ( ) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext ( ) ;
ctx . register ( AppConfig . class ) ;
ctx . register ( FactoryBeanCallingConfig . class ) ;
ctx . refresh ( ) ;
assertEquals ( "true" , ctx . getBean ( "myString" ) ) ;
}
class MyFactoryBean implements FactoryBean < String > {
@Override
public String getObject ( ) throws Exception {
return "foo" ;
}
@Override
public Class < String > getObjectType ( ) {
return String . class ;
}
@Override
public boolean isSingleton ( ) {
return true ;
static class DummyBean {
}
}
class MyParameterizedFactoryBean < T > implements FactoryBean < T > {
static class MyFactoryBean implements FactoryBean < String > , InitializingBean {
private final T obj ;
private boolean initialized = false ;
public MyParameterizedFactoryBean ( T obj ) {
this . obj = obj ;
}
@Override
public void afterPropertiesSet ( ) throws Exception {
this . initialized = true ;
}
@Override
public String getObject ( ) throws Exception {
return "foo" ;
}
@Override
public Class < String > getObjectType ( ) {
return String . class ;
}
@Override
public boolean isSingleton ( ) {
return true ;
}
@Override
public T getObject ( ) throws Exception {
return obj ;
public String getString ( ) {
return Boolean . toString ( this . initialized ) ;
}
}
@Override
@SuppressWarnings ( "unchecked" )
public Class < T > getObjectType ( ) {
return ( Class < T > ) obj . getClass ( ) ;
static class MyParameterizedFactoryBean < T > implements FactoryBean < T > {
private final T obj ;
public MyParameterizedFactoryBean ( T obj ) {
this . obj = obj ;
}
@Override
public T getObject ( ) throws Exception {
return obj ;
}
@Override
@SuppressWarnings ( "unchecked" )
public Class < T > getObjectType ( ) {
return ( Class < T > ) obj . getClass ( ) ;
}
@Override
public boolean isSingleton ( ) {
return true ;
}
}
@Override
public boolean isSingleton ( ) {
return true ;
@Configuration
static class AppConfig {
@Bean
public DummyBean dummyBean ( ) {
return new DummyBean ( ) ;
}
}
}
@Configuration
class AppConfig {
@Bean
public DummyBean dummyBean ( ) {
return new DummyBean ( ) ;
@Configuration
static class ConcreteFactoryBeanImplementationConfig {
@Autowired
private DummyBean dummyBean ;
@Bean
public MyFactoryBean factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
}
}
@Configuration
class ConcreteFactoryBeanImplementationConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class ParameterizedFactoryBeanImplementationConfig {
@Autowired
private DummyBean dummyBean ;
@Bean
public MyFactoryBean factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
@Bean
public MyParameterizedFactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyParameterizedFactoryBean < String > ( "whatev" ) ;
}
}
}
@Configuration
class ParameterizedFactoryBeanImplementationConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class ParameterizedFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Bean
public MyParameterizedFactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyParameterizedFactoryBean < String > ( "whatev" ) ;
@Bean
public FactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
}
}
@Configuration
class ParameterizedFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class NonPublicParameterizedFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Bean
public FactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
@Bean
FactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
}
}
@Configuration
class NonPublicParameterizedFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class RawFactoryBeanInterfaceConfig {
@Bean
FactoryBean < String > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
@Autowired
private DummyBean dummyBean ;
@Bean
@SuppressWarnings ( "rawtypes" )
public FactoryBean factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
}
}
@Configuration
class RawFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class WildcardParameterizedFactoryBeanInterfaceConfig {
@Bean
@SuppressWarnings ( "rawtypes" )
public FactoryBean factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
@Autowired
private DummyBean dummyBean ;
@Bean
public FactoryBean < ? > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
}
}
@Configuration
class WildcardParameterizedFactoryBeanInterfaceConfig {
@Autowired
private DummyBean dummyBean ;
@Configuration
static class FactoryBeanCallingConfig {
@Autowired
private DummyBean dummyBean ;
@Bean
public FactoryBean < ? > factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
@Bean
public MyFactoryBean factoryBean ( ) {
Assert . notNull ( dummyBean , "DummyBean was not injected." ) ;
return new MyFactoryBean ( ) ;
}
@Bean
public String myString ( ) {
return factoryBean ( ) . getString ( ) ;
}
}
}