0

Ich bemerkte Mehrdeutigkeit in der Komponente Scannen und Bean-Erstellung, wenn Sie mit mehreren @Configuration Dateien arbeiten.Spring multiple @Configuration Komponente Scannen Mehrdeutigkeit

Nehmen wir an, ich habe eine Konfiguration für die Sicherheit auf Methodenebene, die Pakete mit Klassen durchsuchen muss, die AOP-Proxied sein müssen. Diese Klassen sind abhängig von anderen Klassen und sind auch Abhängigkeiten für andere Klassen.

Alles funktioniert gut, bis ich für das gleiche Paket in anderer Konfiguration wie in der Stammkonfiguration scannen. Dann beginnen Ausnahmen wie zirkuläre Abhängigkeiten und Bean in Erstellung beginnt zu entstehen. Scheint so, als ob die root-Konfiguration auch versucht, dieselben Objekte zu instanziieren, aber natürlich nicht, da der AOP-Proxy irgendwann in diesem Konfigurationspfad nicht angewendet werden konnte und Abhängigkeiten nicht erfüllt werden konnten.

Alles funktioniert, wenn ich letztlich genau bin, wo ich für was scannen, aber ich bin überrascht, Spring konnte die Bean-Erstellungsreihenfolge nicht automatisch orchestrieren. Ist das wirklich der Fall oder ist etwas Fischiges los?

Antwort

1

Dies ist nicht fischig. Die Beans werden in einem AppContext gespeichert. Das Design von Spring ist wie folgt: Sie können zwei Instanzen der gleichen Klasse im selben Kontext haben! Wenn Sie den MyService zweimal über die Konfiguration konfigurieren, welche Instanz sollte autowired werden? Sehen Sie folgendes Beispiel:

@Autowired 
private final MyService myService = null; 

Aufgrund Ihrer Scan zweimal gearbeitet, Sie zwei mögliche Kandidaten für die Injektion und die Feder nicht autowire haben und gibt eine Ausnahme (in diesem Fall Feder für ein @Primary -Annotation aussieht, aber weil du zweimal scannst, hast du zweimal das @Primary - in diesem Fall hilft es vielleicht nicht.

Was funktioniert, ist der Kunde wählen Sie den richtigen Service so zu lassen:

@Autowired 
private final MyService[] myServices = null; 

Dies funktioniert, können Sie alle Instanzen in der Array.

Eine andere Möglichkeit besteht darin, zwei verschiedene AppContexte in derselben Anwendung zu haben.

+0

Dieses grundlegende Konzept wurde komplett verpasst. Ich arbeite an einer Web-App, sodass mehrere Kontexte nicht passen. Die Auswahl aus einem Array verletzt die Transparenz des Frameworks. Ich denke, meine einzige Entscheidung ist mehr eine isolierende Verpackung, aber es ist irgendwie kontra intuitiv, da Sicherheit ein Querschnittsthema ist. Es kann mehrere Ccc in einem einzigen logischen Paket geben -> einzelne Komponenten in einem Paket sollten von verschiedenen Konfigurationen instanziiert werden. Es wäre sinnvoller, nach diesen Komponenten in der root-Konfiguration zu suchen. Ich freue mich auf einige Best Practices zur Verwaltung mehrerer Konfigurationshierarchien. –

+1

Sicherheit hm? Das Scannen eines Pakets lädt auch 3rd-party-library-Beans, scaning gibt die konkrete Kontrolle weg, die beste Vorgehensweise vielleicht, nicht zu scannen. –

+0

Kann ich Bean in der Konfigurationsdatei * transactional * erstellen? So weit ich weiß, wird der Postprozessor, der durch '@ EnableTransactionManagement' aktiviert wurde,' 'Services' 'als Proxy verwenden, die mit' @Transactional' versehen sind. Ist es genug, '@ Bean' als' @ Transactional' zu definieren? –