4

これは一種の「@Serviceアノテーションとは?」質問ですが、別のアプローチがあります。なぜなら、ここで何が起こっているのかわからないからです:

私はコントローラクラスを持っています:

@Controller
public class GreetingController {
    @Autowired
    SomeBean someBean;

    @MessageMapping("/msg")
    public String msg() {
        someBean.handleMsg();
        return "";
    }
}

その中からsomeBean.handleMsg宛先に応答を送信しようとします。このようなもの:

public class SomeBean {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    public handleMsg() {
        messagingTemplate.convertAndSend("/topic/someTopic", "Response");
    }
}

構成には2 つのバージョンがあります

  1. SomeBean は.xmlで構成されます。

お気に入り:

< bean id="someBean" class="package.SomeBean"></bean>
  1. SomeBean はサービスとして注釈が付けられています(最初のものにはありません):

お気に入り:

@Service
public class SomeBean{...}
  • これら 2 つのケースでは、インジェクションなどの問題はないことに注意してください。どちらのケースでも、クライアントは正常にサブスクライブされ、メッセージが送信され、メッセージが処理されます。

唯一違いは次のとおりです。

  • アノテーションがある場合SomeBean@Serviceクライアントに正常に応答しますが、アノテーションがない場合、例外はありませんが、クライアントは応答メッセージを受信しません。

質問は次のとおりです。

  • この場合、@Service は実際には何をしますか? 誰かがここで何が起こっているのか説明してもらえますか?
4

2 に答える 2

2

@Service技術的な観点からは、xml ベースの構成との違いはほとんどありません。どちらの方法も、Java クラスを Spring Bean として宣言するために使用されます。Spring Bean は、Spring ベースのアプリケーション内で依存性注入のために管理および使用されます。

主な違いは、 で注釈が付けられたクラスが、@Serviceクラスパス スキャン中の自動検出の候補になることです。アノテーション駆動の依存性注入を使用すると、xml 構成内ですべての Java クラスを Spring Bean として宣言する必要がなくなります。

それがjavadocの言うことです:

注釈付きクラスが「サービス」であることを示します。これは、もともとドメイン駆動設計 (Evans、2003) によって「カプセル化された状態のない、モデル内でスタンドアロンのインターフェイスとして提供される操作」として定義されていました。

また、クラスが「ビジネス サービス ファサード」(コア J2EE パターンの意味で)、または同様のものであることを示す場合もあります。この注釈は汎用的なステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。

このアノテーションは @Component の特殊化として機能し、実装クラスがクラスパス スキャンによって自動検出されるようにします。

于 2015-03-31T17:10:34.353 に答える