Springアノテーションサービスの詳細説明

サービスのアノテーション

@Service アノテーションはSpring Frameworkにおけるアノテーションであり、このクラスをビジネスロジック層のサービスBeanとして識別します。これは、Spring アプリケーションが開始されると、Bean が自動的に作成され、Spring アプリケーションのコンテキストに追加されることを意味します。
つまり、@Service アノテーションとはサービス層Beanをマークするためのアノテーションであり、Spring Bootアプリケーションでビジネスロジックの再利用を実現するための重要な手法の1つです。

サービスの使い方と事例

@Service アノテーションを使用して、クラスをビジネス ロジック コンポーネントとして宣言し、そのオブジェクトを Spring コンテナーに格納できます。コントローラー クラスでは、コンポーネントのインスタンスを挿入することで、そのメソッドを呼び出すことができます。
以下は、@Service アノテーションの使用方法を示す注文サービスのコード例です。
まず、注文サービス インターフェイスを定義します。これには 2 つのメソッドが含まれています。1 つは注文を作成するメソッド、もう 1 つは注文の詳細をクエリするメソッドです。

public interface OrderService {
    
    
    Order createOrder(Order order);
    Order getOrderDetails(String orderId);
}

次に、サービス インターフェイスを実装し、 @Service アノテーションを実装クラスに追加して、サービス層 Bean としてマークします。

@Service
public class OrderServiceImpl implements OrderService {
    
    

    @Override
    public Order createOrder(Order order) {
    
    
        // 在这里执行创建订单的业务逻辑
        return order;
    }

    @Override
    public Order getOrderDetails(String orderId) {
    
    
        // 在这里执行查询订单详情的业务逻辑
        return new Order();
    }
}
}

最後に、このサービス クラスのインスタンスを挿入することで、このサービス クラスのビジネス ロジックを他のコンポーネント (コントローラーなど) で使用できます。たとえば、次のコード例は、コントローラー コンポーネントにオーダー サービスを挿入して使用する方法を示しています。

@RestController
public class OrderController {
    
    

    @Autowired
    private OrderService orderService;

    @PostMapping("/orders")
    public Order createOrder(@RequestBody Order order) {
    
    
        return orderService.createOrder(order);
    }

    @GetMapping("/orders/{orderId}")
    public Order getOrderDetails(@PathVariable String orderId) {
    
    
        return orderService.getOrderDetails(orderId);
    }
}

伝統的な方法ではどのように行われるのでしょうか?

public class OrderController {
    
    
    private OrderService orderService = new OrderServiceImpl();
    
    public Order createOrder(Order order) {
    
    
        return orderService.createOrder(order);
    }

    public Order getOrderDetails(String orderId) {
    
    
        return orderService.getOrderDetails(orderId);
    }
}

このメソッドは、コントローラー コンポーネントでサービス クラスのインスタンスを直接作成し、コントローラー コンポーネントのサービス クラスのビジネス ロジックを呼び出していることがわかります。したがって、このアプローチの欠点はすぐに明らかです。
1. オブジェクトを手動で作成し、コードに依存関係を手動で書き込みます。
2. 各クラスは、必要な他のクラスのインスタンスを明示的に作成し、コード内でこれらのインスタンスを明示的に参照する必要があります。
3. コードには、インスタンスの作成とインスタンスの参照のための退屈なコードがたくさん含まれており、保守が困難になる場合があります。
このアプローチは、コードが単純で依存関係があまりない場合には実現可能ですが、複雑なプロジェクトでは、コードの複雑さと依存関係の維持の難しさが問題になることがよくあります。

@Service アノテーションはビジネス ロジックの再利用をどのように反映しますか?

次の例は、OrderService クラスの複数のインスタンスを使用して、ビジネス ロジックをさまざまな場所で再利用する方法を示しています。
まず、OrderService インスタンスを別のクラス PaymentService に挿入します。

@Service
public class PaymentService {
    
    

    @Autowired
    private OrderService orderService;

    public void processPayment(long orderId) {
    
    
        // 调用订单服务以获取订单详细信息
        Order order = orderService.getOrderById(orderId);
        // 执行付款操作
        ...
    }
}

このコードでは、OrderService クラスのインスタンスを挿入することで、PaymentService クラスの OrderService で getOrderById() メソッドを使用できます。このようにして、OrderService のビジネス ロジックを各クラスに実装することなく、複数の異なるクラスで再利用できます

要約する

Service の注釈が付けられたサービス クラスは、他のコンポーネントがビジネス ロジックを再利用する方法を提供し、繰り返しコードを記述することを減らすことができます。オブジェクトの作成と破棄を手動で管理する必要も、オブジェクト間の依存関係を手動で維持する必要もありません。コードの保守性を向上させます。
これは、コントローラー コンポーネントおよびロジック層のリクエスト処理コンポーネントと組み合わせて使用​​されることがよくあります。サービス クラスのインスタンスをコントローラー コンポーネントに挿入し、そのインスタンスを使用してサービス クラスのビジネス ロジックを呼び出し、結果をサーバーに返します。リクエスト処理コンポーネント。

おすすめ

転載: blog.csdn.net/juggle_gap_horse/article/details/128972813