30

Pro Spring 3という本を読んでいます。それには、私を本当に混乱させた特定の段落があります。この段落は、春の自動配線についてです。ここに抜粋があります:

ほとんどの場合、自動配線を使用する必要があるかどうかという質問に対する答えは、間違いなく「いいえ!」です。自動配線は小さなアプリケーションでは時間を節約できますが、多くの場合、悪い習慣につながり、大規模なアプリケーションでは柔軟性がありません。byName を使用するのは良い考えのように思えますが、自動配線機能を利用できるように、クラスに人為的なプロパティ名を付ける必要がある場合があります。Spring の背後にある全体的なアイデアは、好きなようにクラスを作成し、Spring を機能させることができるということです。その逆ではありません...

... 自明ではないアプリケーションの場合は、何としてでも自動配線を避けてください。

作成したアプリケーションでは常に @Autowired タグを使用しています。誰かがそれの何が悪いのか、代わりに何を使うべきかを説明できますか?

私が現在ほとんどのことを処理する方法の小さな例は次のとおりです。

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }
}    

この「間違った」ような自動配線を使用していますか、それとも何か不足していますか?

4

4 に答える 4

25

ここには2つの混乱があると思います。この章で「自動配線」とは、依存関係の自動検出と注入のために Bean をマークすることを意味します。これは、「autowire」Bean 属性を設定することで実現できます。

これは実際@Autowired、依存性注入のためにフィールドまたはセッターを明示的に示す場所を使用することとは対照的です。

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-autowireをご覧ください。

それを説明するために、あなたが持っていると仮定します

public class SnippetService {

    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }

    public void setTestService(TestService testService) {
      this.testService = testService;
    }
}

Bean を定義した場合:

<bean class="mypackage.SnippetService" autowire="byType"/>

TestServicespring は、この場合、setTestService セッターを呼び出して、一致するタイプの Bean を注入しようとします。使用していなくても@Autowired。一部のセッターは春によって呼び出されることを意図していない可能性があるため、これは確かに危険です。

autowire="no" を設定すると@Autowired、 , @Resource, でマークされていない限り、何も注入されません@Inject

于 2012-10-16T18:06:51.563 に答える
3

TestService特にとにかくの1つの実装から始めている場合は、あなたが持っているものに何の問題もありません。ただし、Johan が言及しているように、@javax.annotation.Resource必要に応じてより具体的にすることができるものを使用することをお勧めします (たとえば、nameまたはtype属性を使用します)。

于 2012-10-16T18:00:54.403 に答える
2

ここで私が目にする唯一の問題は、あなたがコントロールを少し失っていることです。たとえば、TestServiceアプリ構成に のインスタンスが 2 つ以上あり、そのうちの 1 つを使用したいとします。makeをAutowire使用することは、構成 XML を使用して挿入するよりもトリッキーです。これはあなたの本が指摘しようとしていることです。つまり、そのようなニーズがより頻繁に発生する大きなアプリケーションでは、困難/トリッキーになります。

そのような状況でなければ、大丈夫だと思います。

于 2012-10-16T18:04:14.510 に答える
0

XML を介したオートワイヤーは、コンストラクター ベースのオートワイヤーを行う場合、特にコラボレーターを非公開にする場合に、完全に安全で役立ちます。

数年前に非常に大規模なSpring 2.5プロジェクトで上記を行ったときに、著者が言ったことに少しショックを受けました。(JBoss でアノテーションのサポートが機能していなかった当時)

于 2012-10-17T19:20:57.360 に答える