2

わかりました、この質問は多くの反対票を獲得するでしょう...

男がSpring xml beanfactoryの問題に直面しているこの質問を見たところです。

これがなぜなのかを理解したい:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="namingStrategy">
        <ref bean="namingStrategy"/>
    </property>
    <property name="mappingResources">
        <list>
            <!--<value>genericdaotest/domain/Person.hbm.xml</value>-->
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
</bean>

とにかくこれよりも優れているはずです:

public class BeanFactory {
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
        bean.setNamingStrategy(getNamingStrategy());
        bean.setMappingResources(Arrays.asList(getPerson());
        bean.setHibernateProperties(new Properties() {{ 
           setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
           setProperty("hibernate.show_sql", "true")
           setProperty("hibernate.hbm2ddl.auto", "create");
        }});
        bean.setDataSource(getDataSource());
        return bean;
    }
}

短く、理解しやすく、Spring の癖がなく、外部ライブラリを実行する必要がなく (他のライブラリと衝突する可能性があります)、段階的なデバッグが可能で、単体テストが可能であり、そうではありません。リフレクションは必要ありません。OOP の利点となる可能性があります。IDE からリファクタリングする方が簡単です。コンパイル時に型がチェックされます。XML ではなく Java であり、実行時に解析する必要はありません。コンパイル時に、形式的に正しい (実行時に例外を検出しない) 場合、構成パラメーターを外部化する必要がある場合は、プロパティ ファイル (実際の構成を含む) を使用します。

そして何よりも、私のコードには、あらゆる種類のオブジェクト (IoC の原則とは何の関係もない巨大で醜いサービス ロケーターなど) をインスタンス化する責任がある "BeanFactory" と呼ばれる巨大なシングルトン クラスは必要ありません。

したがって、質問は次のとおりです。

オブジェクトを Java で構成して集約するよりも、巨大な XML を作成する方が好まれるのはなぜですか?

4

6 に答える 6

5

Springの比較的新しいバージョンを使用すると、xmlを使用する必要はまったくありません。次のようにクラスに注釈を付けるだけです...

@Configuration
public class BeanFactory {
     @Bean
     public LocalSessionFactoryBean sessionFactory() {
         LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
        bean.setNamingStrategy(getNamingStrategy());
        bean.setMappingResources(Arrays.asList(getPerson());
        bean.setHibernateProperties(new Properties() {{ 
           setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
           setProperty("hibernate.show_sql", "true")
           setProperty("hibernate.hbm2ddl.auto", "create");
        }});
        bean.setDataSource(dataSource());
        return bean;
    }

    @Bean
    public DataSource dataSource() { 
    ....
}

依存性注入の本当の利点は、Beanを使用するクラスにあります。あなたのコードは配管コードで散らかっていません、それはビジネス問題を解決することに焦点を合わせています。

于 2013-01-08T16:51:31.400 に答える
1

Javaでオブジェクトを構成および集約するオブジェクトを作成するよりも、巨大なXMLを作成する方がよいのはなぜですか?

私が受け取った回答についての私の理解は、多くの人がXMLをソースコードではなく構成だと考えているということです。したがって、XMLを変更することは、Javaクラスを変更するよりもリスクが少ないか便利であると見なされます。

Javaソースを変更するよりもXMLを変更することの利点は、アプリケーションを再コンパイルする必要がないことです。そのため、これらの変更は、通常の開発アクティビティ(およびテスト)に関与することなく、テスト/本番環境で簡単にプッシュできます。そして、これは-私の個人的な見解では-物語の最悪の部分です。

IoCの良いところは何ですか、それは私が尋ねたものではありません。私の意図は、オブジェクトの構築をプログラムするためにJavaソースに依存するのではなく、多くの開発者がそのようなXMLファイルを好む理由を理解することです。
幸いなことに、このアプローチは却下される(または少なくとも削減される)途中であり、SpringアノテーションやJavaソースコードに基づく他のフレームワーク(前述のGuiceなど)が支持されています。

于 2013-01-10T13:51:46.347 に答える
1

「依存性注入の利点は何ですか?」という質問の方が適切かもしれません。結局のところ、XML の代わりに純粋な Java を使用する依存性注入フレームワークは他にもあります。( Google ガイドを参照)

すべては、コードを切り離して別の場所に「配線」するための便利なテクニックを見つけることにかかっています。

于 2013-01-08T22:03:05.473 に答える
0

IOC xmlインスタンス化は、アプリケーションにモジュール性を提供します。自動配線を使用することにより、クラス内でメンバー変数/サービスを明示的に設定する必要はありません。1..2..3..nサービスを使用する多くのクラスでは、複数のコンストラクターまたはファクトリクラスが必要になる場合があります。あるいは、そのクラスで使用されるサービスを取得および設定するための最悪のアプローチが必要になる場合があります。Springを使用することで、クラス内でそれを定義でき、そのクラスのコンシューマーは特別なメソッドを知ったり呼び出したりする必要がありません。そのBeanコンポーネントを注釈付きの表記で定義し、必要に応じて自動配線するだけで、ファクトリをコーディングする必要はありません。

XML駆動型に関しては、hynessが最もよく言っていると思います。アノテーションを介した自動配線は、Springのバージョンをアップグレードできれば、xmlドキュメントを維持する負担を大幅に減らすことができます。

于 2013-01-08T17:01:15.730 に答える
0

XML ファイルを使用してアプリを構成すると、必要なファイルの数が増えるため、複雑さが増す可能性があります。コードをそのまま維持し、たとえば別の Hibernate Dialect を使用したい場合などに変更を避けるという利点があります。

于 2013-01-08T17:09:00.820 に答える
0

制御の反転または依存性注入は、ソース コードに触れることなく依存性を制御するのに役立ちます。そして、これを XML で行うことができます

于 2013-01-08T16:56:31.160 に答える