2016-09-26 2 views
0

私はペットプロジェクトをGuiceからSpring DIに移し終えました。私はいくつかのノートを共有し、アドバイスを求めたいです。 Guice configはアノテーション(唯一の可能な方法)で行われ、Springコンフィグレーションは@Configurationでアノテーションされた1つのAppConfigクラスと@Bean内部でアノテーションされたたくさんのBean作成メソッドも持つアノテーションでのみ実行されます。GuiceからSpringへの移行:デフォルトのコンストラクタとプロパティの処理を伴うBean

観察と質問:

  1. Springの設定は デフォルトで引数なしのコンストラクタをBeanを作成しない方法でいっぱいです:間違いなく悪い

    @Bean 
    public DataProvider getDataProvider() { 
        return new DataProvider(); 
    } 
    

    厥。 guiceは、追加構成なしで、デフォルトの コンストラクタでBeanをインスタンス化します。私は 春でこれを行うことはできますか?もし私が@Componentアノテーションを クラスパススキャンアノテーションと一緒に追加すると、そのトリックが実行されます。しかし、:1. @Componentでの注入は、@Bean 2での注入とは異なります。 の場合、@Autowiredを追加するよりもさらに多くのファイルに設定を分散する必要があります。それは良くないね。すべての の設定を1つの場所に保持する唯一の解決策は、古いXML設定ですが、もう一度 すべてのBeanの明示的な宣言を行います。または私は間違っています、これは がSpringでうまくいったことができますか?

  2. プロパティファイルの処理。 Guiceと一緒に働いている間、私は悪いことをしました:私は、プロパティ値が注入された膨大な数のプライベートフィールドに沿って@Namedアノテーションを散在させました。いくつかのクラスには5つのプロパティが注入されることがあり、その結果、5つの注釈が得られました。それは良い解決策ではありませんでした。私はSpringでうまくやろうとしましたが、私が見つけた唯一のことはどこでも設定ファイルをインスタンス化して注入することでした。ただ、この完成度の見てみましょう:私のペットプロジェクトが再びリファクタリングする必要がありますように
    @Bean 
    public MyProjectStorageConfiguration getStorageConfiguration(
         @Value("${mongo.collections.names})") String mongoNames, 
         @Value("${mongo.collections.data})") String mongoData, 
         @Value("${files.maindata})") String mainData, 
         @Value("${files.secondarydata})") String secondaryData, 
         @Value("${files.backupdata})") String backupData, 
         @Value("${files.additionaldata})") String additionalData) { 
        return new MyProjectStorageConfiguration(mongoNames,mongoData, mainData,secondaryData,backupData,additionalData); 
    } 
    

が見えます。助言がありますか?

+1

ポイント1ではわかりませんが、ポイント2は作成後にBeanを取得するBeanポストプロセッサを作成することで実行できます。次に、独自のBeanを検査し、文字列や整数などのプロパティタイプを自動挿入することができます。もちろん、注入可能なプロパティに名前を付ける方法やそれをプロパティとしてマークする別の注釈のいずれかを考え出す必要があります。そして、慣習として、フィールド名はプロパティ名に対応することができ、豆に関するアノテーションなしでそれらを解決できますか?個人的には、私はこれを明示的にするといいと思う。あまりにも多くの魔法の殺害;) – pandaadb

答えて

0
  1. はい、そうです。これは本当に悪い習慣です。
    しかし、それはSpring自体に起因するものではありません。ちょうどチュートリアルや他のすべてのことが書かれています。実際にはコンストラクタで@Autowiredを使用することができ、Springは必要なパラメータの型に適合するintefaces/classesを注入します。
    覚えておくべき大きなもの(Guiceから来ている):同じインターフェース(2つの異なる実装)のインスタンスが2つ以上ある場合は、正しいものを選択してから、そのパラメータをセッター注釈@Autowired@Qualifier("[beanName]")を追加します。または

    @Service 
    class AClass implements MyService { 
    
        @Autowired 
        public AClass(UniqueInterface uniqueInterface) { 
        ... 
        } 
    
        @Autowired 
        @Qualifier("[beanName]") 
        public void setAnInterface(NotUniqueInterface notUniqueInterface) { 
         ... 
        } 
    } 
    
  2. 通常は、コード内でプロパティ値を直接注入することができる...設定ファイルにすべてを移動します。 values injection modesを参照してください。しかし、ある意味では、値を注釈で挿入するか、構成Beanを使用する必要があります。他の方法はありません(少なくとも私が知っているものは...)。

関連する問題