Spring-Annotationen - @ - Konfiguration aufrufen, spring-bean-auto-Gebäude
Wenn ich deklarieren Sie eine Klasse, die mit @Bean und dann die scan-Komponente für die Klasse Frühjahr wird die Klasse instanziiert, indem er den Konstruktor und Konstruktor Injektion args und die Injektion alle Felder, die mit @Inject. Der Einfachheit halber nennen wir in diesem Frühjahr auto-Gebäude.
Ich nicht mag-Komponente Scannen und vermeiden wollen, dass es komplett (ich will gar nicht diskutieren, meine Gründe für das nicht zu mögen). Ich möchte eine @Configuration-Objekt, das anstelle würde aber gerne noch die auto-Bau-Funktionalität zur Verfügung zu mir. Ist es möglich, zum aufrufen von Frühling zu auto-bauen meine Objekte anstatt explizit zu müssen, passieren alle die Konstruktor-Argumente in meinem @ - Konfiguration-Objekt?
Können davon ausgehen, dass ich eine bean:
public class MyServiceImpl implements MyService {
public MyServiceImpl(Dependency1 d1, Dependency d2) { ... }
....
}
Konnte ich eine Konfiguration festlegen-Objekt wie folgt:
@Configuration
public class MyConfiguration {
//lets assume d1 and d2 are defined in another @Configuration
@Inject
Dependency1 d1;
@Inject
Dependency2 d2;
@Bean
public MyService myService() {
//I dislike how I have to explicitly call the constructor here
return new MyServiceImpl(d1, d2);
}
}
Aber jetzt, ich habe ausdrücklich anrufen musste MyServiceImpl Konstruktor mich, so habe ich immer die Aktualisierung, wie mein Konstruktor Veränderungen über die Zeit.
Ich hatte gehofft, dass ich könnte, deklarieren Sie eine abstrakte Methode, so dass die Feder auto-Bau stattfinden könnte:
@Configuration
public abstract class MyConfiguration {
@Bean
public abstract MyServiceImpl myService();
}
Aber das funktioniert nicht. Gibt es eine Möglichkeit, die ich aufrufen kann, Frühlings-auto-Gebäude ohne mit component-scan?
In Google Guice, diese kann getan werden, über die Binder:
https://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binder.html
In Tapestry IOC, diese kann getan werden, über die ServiceBinder:
http://tapestry.apache.org/ioc-cookbook-basic-services-and-injection.html#IoCCookbook-BasicServicesandInjection-SimpleServices
Update
Basierend auf spod Antwort, ich war in der Lage zu erreichen, was ich nach (danke!). Test case enthalten, für jeden, der will, das gleiche zu tun:
import java.util.Date;
import javax.inject.Inject;
import junit.framework.Assert;
import org.junit.Test;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class AutoBuildConfigurationTest {
@Configuration
public static class MyConfiguration {
@Inject
private AutowireCapableBeanFactory beanFactory;
@Bean
public Date date() {
return new Date(12345);
}
@Bean
public MyService myService() {
return autoBuild(MyService.class);
}
protected <T> T autoBuild(Class<T> type) {
return type.cast(beanFactory.createBean(type, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, true));
}
}
public static class MyService {
private Date date;
public MyService(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
}
@Test
public void testAutoBuild() {
ApplicationContext appContext = new AnnotationConfigApplicationContext(MyConfiguration.class);
MyService myService = appContext.getBean(MyService.class);
Assert.assertEquals(12345, myService.getDate().getTime());
}
}
InformationsquelleAutor lance-java | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-basierte container-Konfiguration nicht abhängig mache eine scan-Komponente in keiner Weise. Seine lediglich einen anderen Ansatz für die XML-basierte Konfiguration der Komponente. Mit der XML-Konfiguration würden Sie müssen nur erklären bean mit der Klasse MyServiceImpl falls Ihr schon @inject annotiert. Frühling würde erkennen, die Anmerkungen und auf Sie aufpassen. Wenn Sie wirklich wollen, zu instantiieren MyServiceImpl von einem @ - Konfiguration java-Klasse ohne Konstruktor sich selbst, dann würden Sie haben, um die Verwendung der bean factory (nicht getestet, einfach mal ausprobieren):
InformationsquelleAutor Stefan Podkowinski