Erstellen Sie eine mit @Configuration
Anmerkungen versehene Klasse:
@Configuration
public class MyApplicationContext {
}
<bean>
Erstellen Sie für jedes Tag eine Methode mit @Bean
folgenden Anmerkungen :
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
Um zu importieren beanFromSomewhereElse
, müssen wir seine Definition importieren. Es kann in einem XML definiert werden und das werden wir verwenden @ImportResource
:
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Wenn die Bean in einer anderen @Configuration
Klasse definiert ist, können wir die @Import
Annotation verwenden:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
Nachdem wir andere XMLs oder @Configuration
Klassen importiert haben , können wir die Beans verwenden, die sie in unserem Kontext deklarieren, indem wir ein privates Mitglied für die @Configuration
Klasse wie folgt deklarieren :
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
Oder es direkt als Parameter in dem Verfahren verwendet werden, die in den Bohnen definiert , die davon abhängt beanFromSomewhereElse
Verwendung @Qualifier
wie folgt:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Das Importieren von Eigenschaften ist dem Importieren von Bean aus einer anderen XML-Datei oder @Configuration
Klasse sehr ähnlich . Anstatt zu verwenden, verwenden @Qualifier
wir @Value
folgende Eigenschaften:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Dies kann auch mit SpEL- Ausdrücken verwendet werden.
Damit spring solche Klassen als Bohnenbehälter behandeln kann, müssen wir dies in unserer Haupt-XML markieren, indem wir dieses Tag in den Kontext einfügen:
<context:annotation-config/>
Sie können jetzt @Configuration
Klassen genauso importieren , wie Sie eine einfache Bean erstellen würden:
<bean class="some.package.MyApplicationContext"/>
Es gibt Möglichkeiten, Spring-XMLs insgesamt zu vermeiden, sie fallen jedoch nicht in den Geltungsbereich dieser Antwort. Eine dieser Optionen finden Sie in meinem Blog-Beitrag, auf den ich meine Antwort stütze.
Grundsätzlich finde ich diese Methode zum Deklarieren von Beans aufgrund einiger Vorteile, die ich sehe, viel komfortabler als die Verwendung von XMLs:
Die Nachteile sind nicht viele, wie ich sie sehe, aber es gibt einige, an die ich denken könnte:
@Component
@Service
oder andere solche Anmerkungen hat, würde automatisch in eine Bean umgewandelt (aber das war nicht der Fokus dieser Frage)