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

Schreibe einen Kommentar