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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Dokumentation für
@Import
erwähnt, dass Sie verwenden sollten@Autowired
in Fällen, wie Sie Sie beschreiben:Es ist nicht die
@Autowired
Ursache Ihres Problems. Von wo aus Sie Erfahrung die hängen, ich erwarte, dass Sie haben eine Bohne, die etwas auf startup, das nicht rechtzeitig beendet. Da die bean-Initialisierung wird nie abgeschlossen, der Frühling kann nicht mehr starten. Eine Art von Netzwerk-Kommunikation ist wahrscheinlich, wie diejenigen, die haben eine schlechte Angewohnheit, hängen auf unbestimmte Zeit keine Ausgabe, sofern nicht ausdrücklich anderweitig konfiguriert. Ziehen Sie einen stack dump, wenn die JVM hing, und sehen, was deine threads tun. Ansonsten einen debugger Anhängen und manuell anhalten der JVM für den gleichen Effekt.