Frühjahr: Referenz bean in @import-Datei während der annotation-basierte Konfiguration

Habe ich zwei spring-Konfiguration Klassen A und B. Bohnen in B sind importiert in Eine mit der @import-Anmerkung, wie diese

@Configuration
@Import({B.class})
public class A {
    private BBean bbean;

    @Bean
    public ABean aBean() {
        //need to reference B's bean over here
        return aBean()//after referencing B's bean
    }
}

@Configuration
public class B {
    @Bean
    public BBean bBean(){
       return new BBean();        
    }
}

Wie würde ich Referenz die bean bBean beim erstellen bean aBean? Man würde denken, dass @Erforderlich oder @Autowired hier arbeiten würde, aber es funktioniert nicht 🙁

UPDATE - Was ich versuche zu tun ist, führen Sie Komponententests mit TestNG und maven. Wenn ich versuche, eine Referenz der 'Autowired" - Bohne, maven hängt, möglicherweise in einer Endlosschleife oder wartet der bean geladen werden.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
13:15:42,427  INFO eans.factory.xml.XmlBeanDefinitionReader: 315 - Loading XML bean definitions from class path resource [META-INF/spring/app-context.xml]
13:15:42,589  INFO nnotation.ClassPathBeanDefinitionScanner: 210 - JSR-330 'javax.inject.Named' annotation found and supported for component scanning
13:15:42,671  INFO ontext.support.GenericApplicationContext: 495 - Refreshing org.springframework.context.support.GenericApplicationContext@45d6a56e: startup date [Fri Feb 15 13:15:42 PST 2013]; root of context hierarchy
13:15:42,769  INFO ctory.support.DefaultListableBeanFactory: 623 - Overriding bean definition for bean 'dataSource': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=repositoryConfig; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/abc/pagg/ddee/repository/config/RepositoryConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=serviceConfig; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/abc/pagg/ddee/service/config/ServiceConfig.class]]
13:15:42,983  INFO ion.AutowiredAnnotationBeanPostProcessor: 139 - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
13:15:43,027  INFO ctory.support.DefaultListableBeanFactory: 557 - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@66b51404: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,serviceConfig,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,transactionManager,sqlSessionFactory,org.mybatis.spring.mapper.MapperScannerConfigurer#0,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,commonConfig,propertiesConfig,repositoryConfig,iusRestManager,localCacheClientAdapter,memcachedClientAdapter,s3Adapter,dataSource,userMapper]; root of factory hierarchy  <<--- hangs right here

UPDATE - code der hier

@Configuration
@Import({CommonConfig.class})
public class ServiceConfig {
private final Logger log = LoggerFactory.getLogger(ServiceConfig.class);
private org.apache.commons.configuration.Configuration propertiesConfig;

@Autowired
public void setPropertiesConfig(org.apache.commons.configuration.Configuration propertiesConfig){
    this.propertiesConfig = propertiesConfig;
}

public ServiceConfig() {
}

@Bean
public DataSource dataSource() {
    final BasicDataSource dataSource = new BasicDataSource();
 --->   dataSource.setDriverClassName(propertiesConfig.getString("jdbc.driver")); <----
    //dataSource.setUrl(propertiesConfig.getString("jdbc.url"));
    //dataSource.setUsername(propertiesConfig.getString("jdbc.username"));
    //dataSource.setPassword(propertiesConfig.getString("jdbc.password"));

    return dataSource;
}

Die Bohne propertiesConfig definiert ist, in CommonConfig. Ich bekomme eine invocationTargetException auf der markierten Linie, weil propertiesConfig null ist. Die dataSource-bean hält immer instanziiert in einer Schleife.

  • Sind Sie sicher, dass @Autowired funktioniert nicht? Ich benutze es mit Erfolg in diesem Szenario, außer, dass ich mich auf auto-entdeckt Bohnen während Komponente Scannen.
  • sollte funktionieren, ich benutze es, und das gleiche Schema in verschiedenen apps.
  • re: update, wenn Sie feststellen, dass der Frühling hängt beim erstellen der bean factory, ich würde versuchen, einige Haltepunkte festlegen und fügen Sie einen debugger, um herauszufinden, wo genau es hängt. Welche version von Spring? Tun Sie das gleiche Verhalten angezeigt, wenn Sie den test ausführen, eine IDE-als wenn man es mit mvn von der Kommandozeile aus?
  • Es ist mavent, dass tatsächlich hängen. Das Anhängen eines Debuggers helfen würde. Aber ja, ich sehe das gleiche Verhalten, wenn ich den test ausführen aus Eclipse heraus mit Debug -> TestNG Test
  • Wurde das jemals aufgelöst? Ein ähnliches problem habe ich jetzt. Keine Hänger, aber durch Debuggen kann ich sehen, dass die init-Reihenfolge ist funky. Ich habe die DataSource-annotiert mit @Autowired, aber es scheint, es wird nur initialisiert, die in der importierten config, NACHDEM ich wirklich brauchen, es in der Haupt-config.Dies ist insbesondere ein problem mit jUnit testen, aber ich erwarte, dass das gleiche Verhalten in der Produktion. Jede bekam man irgendwelche tricks?
InformationsquelleAutor nsdiv | 2013-02-15
Schreibe einen Kommentar