Erhalten Sie Zugriff auf alle spring-beans eines Typs
Ich habe eine Spring-Anwendung (Spring Batch nicht-web-Anwendung). In einer test-Klasse, die ich packen möchte Zugriff auf alle meine Bohnen von einem bestimmten Typ.
Ich verstehe, dass im Frühjahr sollten Sie verwenden in der Regel IOC und lassen Sie den Behälter Spritzen Sie Ihre Bohnen. Aber in diesem Fall möchte ich eine Schleife durch eine variable Anzahl von Bohnen, die für die Erweiterung einer bestimmten Klasse (org.springframework.batch.Element.Datenbank.JdbcCursorItemReader), und etwas tun (wollen, dass es eine unit/- integration-test, die nur eine Verbindung mit der Datenbank und liest 1 Zeile, so können wir bestätigen, im test Zeit, dass alle JdbcCursorItemReader im system gültige SQL-und row-Mapper).
Problem 1) ich kann nur Bohnen ein zu einer Zeit. Ich kann meine Klasse implementieren BeanFactoryAware, um einen Verweis auf meine beanfactory. Dann kann ich beanFactory.getBean("name"); für den Zugriff auf eine einzelne Bohne. Wie kann ich stattdessen bekommen ALLE Bohnen? Ich kann in einer Schleife durch und fallen diejenigen, die nicht die Klasse, die ich will.. aber irgendwie muss ich eine Liste mit allen Bohnen die beanfactory kennt oder so etwas.
Problem 2) Die Bohne ich wieder aus der beanfactory ist ein proxy. Wenn ich versuche zu casten und meine Bohne bekomme ich so etwas wie
java.lang.Classcastexception-Fehler: $Proxy0 kann nicht umgewandelt werden, org.springframework.batch.Element.Datenbank.JdbcCursorItemReader
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie rund um das erste problem durch die Verwendung
ApplicationContextAware
stattBeanFactoryAware
. Dieser pass wird in derApplicationContext
, die diegetBeansOfType()
Methode, die können Sie abrufen, alle Bohnen, die sind von einem bestimmten Typ.Das zweite problem ist wahrscheinlich verursacht weil etwas erstellen AOP-Proxys, um Ihre
JdbcCursorItemReader
bean. Diese generierten proxies standardmäßig implementieren die gleichen interfaces, dieJdbcCursorItemReader
hat (insbesondereItemReader
undItemStream
). Ihr code sollte nicht versuchen, und cast auf die Klasse geben (JdbcCursorItemReader
), aber einer von denen, interface-Typen statt. Es ist normalerweise möglich, zu zwingen, den proxy zu erweitern die Proxy-Klasse nicht direkt, aber ohne zu wissen, etwas über Ihr setup, kann ich dir nicht helfen mit, dass.ItemReader
sollte funktionieren. Nur versuchen Sie nicht, und werfen, umJdbcCursorItemReader
.