Spring注解之Service用法及示例详解

 更新时间:2024年04月02日 16:55:22   作者:IFSB PRO Chu  
使用 @Service 注解可以将一个类声明为业务逻辑组件,并将其对象存入 Spring 容器中,在控制器类中,通过注入该组件的实例,即可调用其中的方法,这篇文章主要介绍了Spring注解之Service用法及示例详解,需要的朋友可以参考下

Service注解

@Service 注解是 Spring Framework 中的一种注解,它标识了这个类是一个业务逻辑层的服务 Bean。这意味着当 Spring 应用启动时,该 Bean 会被自动创建并加入到 Spring 应用上下文中。
简而言之,@Service 注解是一种用于标记服务层 Bean 的注解,是在 Spring Boot 应用中实现业务逻辑复用的重要方法之一。

Service用法及示例

使用 @Service 注解可以将一个类声明为业务逻辑组件,并将其对象存入 Spring 容器中。在控制器类中,通过注入该组件的实例,即可调用其中的方法。
以下是一个关于订单服务的代码示例,该示例说明了如何使用 @Service 注解。
首先,我们定义了一个订单服务接口,该接口包含两个方法:一个创建订单,一个查询订单详情。

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();
    }
}
}

最后,我们可以在其他组件(比如Controller)中通过注入该服务类实例来使用该服务类中的业务逻辑。例如,下面的代码示例显示了如何在Controller组件中注入并使用该订单服务。

@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 类的多个实例在不同的地方复用业务逻辑。
首先,我们在另一个类PaymentService中注入 OrderService 实例:

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

这段代码中,通过注入 OrderService 类的实例,我们可以在 PaymentService 类中使用 OrderService 中的 getOrderById() 方法。这样,我们就可以在多个不同的类中复用 OrderService 中的业务逻辑,而不必在每个类中都实现一遍

总结

使用Service注解的服务类为其他组件提供了一种复用业务逻辑的方法,能够减少重复代码的编写。不需要自己手动管理对象的创建和销毁,也不需要自己手动维护对象之间的依赖关系。提高代码的可维护性。
常常与控制器组件和逻辑层的请求处理组件搭配使用:在控制器组件中注入服务类实例,然后使用该实例调用服务类的业务逻辑,将结果返回给请求处理组件。

相关文章

  • Java中的HashMap内存泄漏问题详解

    Java中的HashMap内存泄漏问题详解

    这篇文章主要介绍了Java中的HashMap内存泄漏问题详解,WeakHashMap中的key是弱引用,如果再使用之后没有及时remove掉这个key,那么当GC时key就可能会被回收,导致key对应的value对象占用的内存无法回收进而导致内存泄漏,需要的朋友可以参考下
    2023-09-09
  • springboot的war和jar包的使用详解

    springboot的war和jar包的使用详解

    这篇文章主要介绍了springboot的war和jar包的使用详解,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • Java HashMap算法原理详细讲解

    Java HashMap算法原理详细讲解

    在java开发中,HashMap是最常用、最常见的集合容器类之一,文中通过示例代码介绍HashMap为啥要二次Hash,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Springboot3自定义starter业务代码

    Springboot3自定义starter业务代码

    在Spring Boot中,starter是一种特殊的依赖,它可以帮助开发人员快速引入和配置某个特定的功能模块,这篇文章给大家介绍Springboot3自定义starter业务代码的相关知识,感兴趣的朋友跟随小编一起看看吧
    2025-05-05
  • Java中Json字符串和Java对象的互转

    Java中Json字符串和Java对象的互转

    本文介绍了JSON作为一种轻量级的数据交换格式,广泛应用于前后端数据传输,本文就来详细的介绍一下Java中Json字符串和Java对象的互转,感兴趣的可以了解一下
    2025-12-12
  • Java并发编程(CyclicBarrier)实例详解

    Java并发编程(CyclicBarrier)实例详解

    这篇文章主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。
    2017-07-07
  • 关于Spring Boot内存泄露排查的记录

    关于Spring Boot内存泄露排查的记录

    这篇文章主要介绍了关于Spring Boot内存泄露排查的记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 关于Java整合RocketMQ实现生产消费详解

    关于Java整合RocketMQ实现生产消费详解

    这篇文章主要介绍了关于Java整合RocketMQ实现生产消费详解,RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,需要的朋友可以参考下
    2023-05-05
  • 手工体验smtp和pop3协议 邮件实现详解(二)

    手工体验smtp和pop3协议 邮件实现详解(二)

    POP3/IMAP协议定义了邮件客户端软件和POP3邮件服务器的通信规则,这篇文章我们就来手工体验SMTP和POP3协议的奥秘,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • java实现CSV文件导入与导出功能

    java实现CSV文件导入与导出功能

    这篇文章主要为大家详细介绍了java实现CSV文件导入与导出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论