Frage

Gibt es eine Möglichkeit, um Auto-Guss Spring-Beans auf die Klasse im Anwendungskontext XML definiert? Ich mag Art Informationen über die Bohnen in 2 Plätzen vermeiden, dass .... in der XML-Konfigurationsdatei und auch im Code als Guss.

Zum Beispiel dieser Konfigurationsdatei angegeben

<bean id="bean-name" class="SimpleSpringBean"  scope="prototype">
    <property name="myValue" value="simple value"></property>
</bean>

Kann ich nennen ApplicationContext.getBean("bean-name") so wie direkt zu vermeiden, den Rückgabetyp Gießen SimpleStringBean. Ich weiß, ich kann auch ApplicationContext.getBean("bean-name", SimpleSpringBean.class) nennt die Besetzung selbst zu vermeiden, aber ich habe immer noch die Art info in 2 Stellen.

Es scheint, dass Frühling die Klasse Informationen bekommen (ApplicationContext.getType) oder durch den Typ aus der Bohne immer selbst, aber keine Möglichkeit, automatisch den Typ ohne Programmierer Intervention zu werfen.

War es hilfreich?

Lösung

ich mit Sii zustimmen, sollten Sie rufen getBean so viel vermeiden, wie Sie können. Nur Ihre Bohnen Klassen verdrahten, die auf ihnen abhängig ist.

Dennoch, wenn Sie eine einzige Klasse, die den Anwendungskontext enthält, können Sie einen Wrapper generische Methode wie folgt liefern:

class MyContextHolder{
    ApplicationContext appContext;
    ......
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName)
    {
        return (T)appContext.getBean(beanName);
    }
}

Dann können Sie es aufrufen, ohne Casting

MyClass mc = MyContextHolder.getBean("myClassBean");

Andere Tipps

Die Antwort ist, sollten Sie verwenden ApplicationContext.getBean nicht () überhaupt, wenn es möglich ist, und tragen mit dem einem Ort, den Sie in dem Bootstrap-Code. (Im Allgemeinen sollten Sie nie getBean () außerhalb Ihrer Anwendung Einstiegspunkte verwenden müssen.)

Auch, was Sie fragen, ist wahrscheinlich unmöglich, in der Java-Sprache überhaupt. Casting ist eine Kompilierung-Funktion, kombiniert mit einer Laufzeitprüfung. Der Rückgabetyp getBean () muss einfach bei der Kompilierung bekannt sein. Auch wenn Frühling den Typ eines Objekts ermittelt werden kann, kann es nicht seine eigene Methode Signaturen zur Laufzeit geändert werden.

Eine andere Sache ist, dass selbst wenn dies möglich wäre, würde das Merkmal nicht so nützlich alle sein. Da Frühling AOP implementiert wird mittels dynamische Proxies, Sie fast immer wollen Frühling Sie eine Instanz einer Schnittstelle der Bohne Geräte zur Hand (der ein AOP-Proxy sein könnte), nicht der Implementierungsklasse.

Ein weiterer Ansatz, den ich auch die Bootstrap-Klasse verwenden, wird autowiring mit:

public class Main {
    @Autowired FooFacade foo;
    @Autowired BarFacade bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("appCtx.xml");
        AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
        Object main = bf.createBean(Main.class, 
                                    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT,
                                    false);
        ((Main) main).run();
    }

    private void run() {
        foo.doBootstrapStuff();
        bar.doMoreBootstrapStuff();
    }
}

(Code aus dem Speicher durchgeführt. Könnte nur funktionieren, wenn Sie den Frühling Kontext haben konfigurierte Verdrahtung Anmerkungen zu verarbeiten, in diesem Fall Setter für foo und bar machen sollte funktionieren.)

Der Hauptgrund für getBean untypisierten zu sein, ist die Kompatibilität von Spring (bis zur Version 2.5.x) mit Java 1.4. Frühling 3.0 wird fallen, dass und somit typisieren getBean Verfahren bietet dann.

Dennoch sollten Sie vermeiden, Bohnen direkt nachschlagen und ihre Nutzung so weit wie möglich minimieren.

Was passiert, wenn ich Frühling als Objekt Fabrik verwenden, die meine Anwendung ausgiebig verwendet. Das heißt, statt eine Reihe von Klassen zu schreiben, die bereits erben oder Wrap-around bekannte Java-Klassen ich nur entscheiden, alles, was in eine XML-Datei auf dem Weg zu fällen Zeilen Java-Code. Dies wird viele Zeilen xml bedeuten, aber ich werde nicht machen müssen Skelett Java-Klassen, die ich mit Frühling oder autowire injizieren. So machen die Linien von Java-Code weniger.

Aus diesem Grunde und nach wie vor, wie ich bin neu in Frühling Ich habe gerade wie in der vorhergehenden angegeben Beiträge statische Java-Methoden verwendet, die Verpackung um die getBeans ().

Ich habe mit Frühling gearbeitet, aber es ist immer noch neu für mich so meine Frage vergeben.

„Weil Frühling AOP implementiert wird mittels dynamische Proxies, Sie fast immer Frühling wollen Sie zur Hand eine Instanz einer Schnittstelle der Bean implementiert (die ein AOP-Proxy sein könnten), nicht der Implementierungsklasse“

Es gibt also keine Möglichkeit, eine dynamische Proxy getBean zu bekommen (), dann, was ist die beste Praxis, wenn es keine Schnittstellen und es ist eine Stand-Klasse allein Fahrer ausgeführt werden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top