7

アプリケーションコンテキストXMLで定義されたクラスにSpringBeanを自動キャストする方法はありますか?Beanに関するタイプ情報を2つの場所に配置することは避けたいと思います....xml構成ファイルとキャストとしてのコードにも。

たとえば、この構成ファイルが与えられた場合

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

ApplicationContext.getBean("bean-name")リターンタイプをに直接キャストしないように呼び出すことはできますかSimpleStringBeanApplicationContext.getBean("bean-name", SimpleSpringBean.class)キャスト自体を避けるために電話することもできますが、2か所にタイプ情報があります。

Springはクラス情報(ApplicationContext.getType)を取得するか、Bean自体から型を取得することで取得できるようですが、プログラマーの介入なしに型を自動的にキャストする方法はありません。

4

6 に答える 6

4

答えは、可能な場合は ApplicationContext.getBean() をまったく使用すべきではなく、ブートストラップ コードで必要な 1 つの場所を我慢することです。(通常、アプリケーションのエントリ ポイント以外で getBean() を使用する必要はありません。)

また、あなたが求めていることは、Java 言語ではまったく不可能である可能性があります。キャストはコンパイル時の機能であり、実行時チェックと組み合わされています。getBean() の戻り値の型は、コンパイル時にわかっている必要があります。Spring がオブジェクトの型を判別できたとしても、実行時に独自のメソッド シグネチャを変更することはできません。

もう 1 つのことは、これが可能であったとしても、この機能はそれほど有用ではないということです。Spring AOP は動的プロキシを使用して実装されるため、ほとんどの場合、実装クラスではなく、Bean が実装するインターフェース (AOP プロキシである可能性があります) のインスタンスを Spring に渡す必要があります。

于 2009-05-01T16:55:15.960 に答える
1

私も使用する別のアプローチは、次を使用してブートストラップ クラスを自動配線することです。

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();
    }
}

(コードはメモリから実行されます。Spring コンテキストがワイヤリング アノテーションを処理するように構成されている場合にのみ機能する可能性があります。その場合、 と のセッターを作成する必要がfooありbarます。)

于 2009-05-01T18:58:32.903 に答える
1

型指定されていない主な理由getBeanは、Spring (バージョン 2.5.x まで) と Java 1.4 との互換性です。Spring 3.0 ではそれが廃止されるため、型付きgetBeanメソッドが提供されます。

それでも、Bean を直接検索することは避け、その使用を可能な限り最小限に抑える必要があります。

于 2009-05-02T17:37:50.077 に答える
0

アプリケーションが広範囲に使用するオブジェクト ファクトリとして Spring を使用するとどうなるでしょうか。つまり、既知の Java クラスを既に継承またはラップする一連のクラスを作成する代わりに、それらすべてを xml ファイルに移動して、Java コードの行数を削減することにしました。これは xml の多くの行を意味しますが、Spring または autowire で注入するスケルトン Java クラスを作成する必要はありません。したがって、Java コードの行数が少なくなります。

このため、Spring を初めて使用する私は、以前の投稿で述べたように、getBeans() をラップする静的 Java メソッドを使用しました。

私はSpringで働いてきましたが、それは私にとってまだ新しいので、私の質問を許してください.

于 2009-09-21T14:07:25.747 に答える
-1

「Spring AOP は動的プロキシを使用して実装されるため、ほとんどの場合、実装クラスではなく、Bean が実装するインターフェース (AOP プロキシである可能性があります) のインスタンスを Spring に渡す必要があります」

したがって、getBean() を使用して動的プロキシを取得する方法はありません。インターフェイスがなく、スタンドアロンのドライバー クラスを実行する場合のベスト プラクティスは何ですか?

于 2010-08-11T20:16:57.683 に答える