Dies ist eine Antwort auf einen Kommentar oben, aber da Kommentare Formatierung und Größe haben nur begrenzte, Ich werde stattdessen mit einer Antwort antworten.
wie funktioniert Feder definiert die Reihenfolge und überwiegenden von Bohnen, wenn Konfigurationsdateien Laden
Es hängt davon ab, was Sie durch das Laden mehrere Konfiguration bedeuten. Wenn Sie einen Spring-Kontext haben und zwei Klassen mit @Configuration haben und einen Komponenten-Scan durchführen, dann erstellt Spring den Abhängigkeitsbaum, und welcher Kontext (Bean) auch immer geladen wird, definiert das Bean (da es die erste Definition überschreibt).
Wenn Sie mehrere Spring-Kontexte in einer übergeordneten untergeordneten Beziehung haben, dann werden die untergeordneten und übergeordneten Beans angezeigt, und überschreibt auch übergeordnete Beans, wenn Sie child.getBean (type.class) verwenden. Der Elternteil kann keine Bohne von Kindern sehen.
Verwenden von @Primary. Wenn Sie einen Spring-Kontext haben (kann aus mehreren Konfigurationen stammen), der zwei Beans desselben Typs definiert, können Sie context.getBean (type.class) oder @AutoWired (ohne @Qualifier) nicht verwenden, da Sie mehrere Beans haben vom gleichen Typ. Dieses Verhalten kann geändert werden, wenn eine der Beans @Primary ist. Ich versuche, die Verwendung von @Primary in meinem eigenen Code zu vermeiden, aber ich kann sehen, es wird stark in Spring Boots Auto konfiguriert System verwendet, so denke ich, es hat eine subtile Verwendung, wenn es um das Design von Rahmen geht.
Hier ein kleines Beispiel: Wenn Sie Konfigurationsklassen direkt laden, benötigen sie nicht die Annotation @Configuration.
public class ParentChildContext {
public static void main(String[] args) {
parentChildContext();
twoConfigurationsSameContext();
}
private static void twoConfigurationsSameContext() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(Parent.class, Child.class);
// if you have two beans of the same type in a context they can be loaded by name
Object childA = ctx.getBean("childA");
System.out.println("childA = " + childA);
Object parentA = ctx.getBean("parentA");
System.out.println("parentA = " + parentA);
// since both configurations define A, you can't do this
ctx.getBean(A.class);
}
private static void parentChildContext() {
ApplicationContext parentCtx = new AnnotationConfigApplicationContext(Parent.class);
A parentA = parentCtx.getBean(A.class);
System.out.println("parent = " + parentA);
AnnotationConfigApplicationContext childCtx = new AnnotationConfigApplicationContext();
childCtx.register(Child.class);
childCtx.setParent(parentCtx);
childCtx.refresh();
A childA = childCtx.getBean(A.class);
System.out.println("child = " + childA);
}
public static class Parent {
@Bean
//@Primary // if you enable @Primary parent bean will override child unless the context is hierarchical
public A parentA() {
return new A("parent");
}
}
public static class Child {
@Bean
public A childA() {
return new A("child");
}
}
public static class A {
private final String s;
public A(String s) {
this.s = s;
}
@Override
public String toString() {
return "A{s='" + s + "'}";
}
}
}
scheint die am besten geeignete Lösung, ich akzeptiere die Antwort, trotzdem wäre es schön zu wissen, warum die Basiskonfiguration statt der Client-spezifischen genommen wurde, wie definiert Spring die Reihenfolge und das Überschreiben von Beans beim Laden von Konfigurationsdateien? – simonC
Wenn Sie zwei Konfigurationen haben, können Sie sie in zwei Kontexten laden, zuerst den übergeordneten und dann den untergeordneten. Das Kind kann Elternbohnen sehen, aber nicht umgekehrt. Auch –
Ignorieren Sie den obigen Kommentar. Ich werde eine zusätzliche Antwort schreiben, da Kommentare zu stackoverflow ziemlich lahm sind! –