私は長い間、私たち全員が使用していたxmlファイルのような「集中型の宣言型構成」を持つことに価値があると信じていました。その後、ファイルの内容のほとんどが構成ではないことに気付きました。開発後、変更されることはありません。次に、「集中型」は非常に小さなシステムでのみ価値があることに気づきました-小さなシステムでのみ、全体として構成ファイルを見ることができます。そして、同じ「配線」がコード内の依存関係によってほとんど複製される場合、実際に配線全体を理解することの価値は何ですか?したがって、私が保持しているのは、メタデータ(注釈)だけです。これは、まだ宣言型です。これらは実行時に変更されることはなく、 誰かがその場で変更する「構成」データ-コードに保持するのは良いことだと思います。
可能な限りフルオートワイヤリングを使用しています。大好きです。銃を突きつけられないと脅されない限り、私は古いスタイルの春には戻りません。私が完全に好む理由は@Autowired
、時とともに変わってきました。
現在、自動配線を使用する最も重要な理由は、追跡するシステムの抽象化が1つ少ないことです。「豆の名前」は事実上なくなりました。xmlのため、Bean名のみが存在することがわかりました。そのため、抽象インダイレクションの完全なレイヤー(Bean名「foo」をBean「bar」にワイヤリングする場所)はなくなりました。ここで、「Foo」インターフェースをBeanに直接配線し、実行時プロファイルによって実装を選択します。これにより、依存関係と実装をトレースするときにコードを操作できます。コードにautowired依存関係が表示されたら、IDEで「実装に移動」キーを押すだけで、既知の実装のリストが表示されます。ほとんどの場合、実装は1つしかなく、私はクラスにまっすぐ入っています。できる' どの実装が使用されているか(XMLワイヤリングを使用すると、その逆は真実に近いと私は主張します-あなたの視点がどのように変化するのか面白いです!)
これは非常に単純なレイヤーと言えますが、システムに追加する抽象化の各レイヤーは複雑さを増します。私が実際に使用したシステムにxmlが実際の価値を追加したことはないと思います。
私がこれまでに使用したほとんどのシステムには、実稼働ランタイム環境の構成が1つしかありません。テストなどの他の構成がある場合があります。
完全自動配線は春のルビーオンレールであると思います。ほとんどのユースケースが従う通常の一般的な使用パターンがあるという概念を採用しています。XML構成を使用すると、意図的または意図的でない多くの一貫した/一貫性のない構成の使用を許可できます。あまりにも多くのxml構成が矛盾して行き過ぎているのを見てきました-コードと一緒にリファクタリングされますか?考えていません。理由のためにそれらのバリエーションはありますか?通常はありません。
構成では修飾子をほとんど使用せず、これらの状況を解決する他の方法を見つけました。これは、私たちが遭遇する明らかな「欠点」です。自動配線との相互作用をよりスムーズにするために、コードの方法を少し変更しました。顧客リポジトリは、汎用Repository<Customer>
インターフェースを実装しなくなりましたがCustomerRepository
、拡張するインターフェースを作成しますRepository<Customer>
。サブクラス化に関しては、1つまたは2つのトリックがある場合もあります。しかし、それは通常、より強いタイピングの方向を示すだけであり、ほとんどの場合、これはより良い解決策だと私は思います。
しかし、はい、あなたは主に春がする特定のスタイルのDIに縛られています。依存関係のパブリックセッターも作成しなくなりました(カプセル化/情報非表示部門で+1していると主張できます)まだシステムにxmlがありますが、xmlには基本的に異常のみが含まれています。完全自動配線はxmlとうまく統合されます。
私たちが今必要とする唯一のものは用で@Component
、@Autowired
残りは(のようなJSRに含まれるJSR-250、我々は春とで結ぶ必要はありませんので、)。これは過去に起こった方法です(java.util.concurrent
思い浮かぶことがあるので)。これが再び起こったとしても、私はまったく驚かないでしょう。