首页 > 其他分享 >Spring Boot 应用案例:打造股票价格自动通知平台

Spring Boot 应用案例:打造股票价格自动通知平台

时间:2024-08-21 18:23:55浏览次数:11  
标签:Spring price boot Boot private springframework org 股票价格 symbol

在本篇博文中,我们将构建一个简单的Spring Boot应用来演示如何创建一个股票价格更新系统,并在股票价格变动时自动通知订阅用户。这个示例将涵盖Spring Boot的核心功能,包括Web模块、数据持久化、消息队列以及简单的用户订阅机制。

项目结构和依赖

首先,我们需要创建一个新的Spring Boot项目,并添加必要的依赖。在pom.xml文件中加入以下依赖:

xml

深色版本

1<dependencies>
2    <dependency>
3        <groupId>org.springframework.boot</groupId>
4        <artifactId>spring-boot-starter-web</artifactId>
5    </dependency>
6    <dependency>
7        <groupId>org.springframework.boot</groupId>
8        <artifactId>spring-boot-starter-data-jpa</artifactId>
9    </dependency>
10    <dependency>
11        <groupId>org.springframework.boot</groupId>
12        <artifactId>spring-boot-starter-amqp</artifactId>
13    </dependency>
14    <dependency>
15        <groupId>com.h2database</groupId>
16        <artifactId>h2</artifactId>
17        <scope>runtime</scope>
18    </dependency>
19    <dependency>
20        <groupId>org.projectlombok</groupId>
21        <artifactId>lombok</artifactId>
22        <optional>true</optional>
23    </dependency>
24    <dependency>
25        <groupId>org.springframework.boot</groupId>
26        <artifactId>spring-boot-devtools</artifactId>
27        <scope>runtime</scope>
28        <optional>true</optional>
29    </dependency>
30    <dependency>
31        <groupId>org.springframework.boot</groupId>
32        <artifactId>spring-boot-starter-test</artifactId>
33        <scope>test</scope>
34    </dependency>
35</dependencies>

配置文件

接下来,在application.properties中配置数据库连接和RabbitMQ:

properties

深色版本

1spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
2spring.datasource.driverClassName=org.h2.Driver
3spring.datasource.username=sa
4spring.datasource.password=
5spring.jpa.hibernate.ddl-auto=create-drop
6
7spring.rabbitmq.host=localhost
8spring.rabbitmq.port=5672
9spring.rabbitmq.username=guest
10spring.rabbitmq.password=guest

实体类和数据模型

定义两个实体类:StockPrice 和 Subscriber。

java

深色版本

1import javax.persistence.Entity;
2import javax.persistence.GeneratedValue;
3import javax.persistence.GenerationType;
4import javax.persistence.Id;
5
6@Entity
7public class StockPrice {
8    @Id
9    @GeneratedValue(strategy = GenerationType.AUTO)
10    private Long id;
11    private String symbol;
12    private double price;
13
14    // Getters and setters
15}
16
17@Entity
18public class Subscriber {
19    @Id
20    @GeneratedValue(strategy = GenerationType.AUTO)
21    private Long id;
22    private String email;
23    private String symbol;
24
25    // Getters and setters
26}

数据访问层 (DAO)

创建两个接口继承JpaRepository以实现基本的CRUD操作:

java

深色版本

1import org.springframework.data.jpa.repository.JpaRepository;
2
3public interface StockPriceRepository extends JpaRepository<StockPrice, Long> {
4}
5
6public interface SubscriberRepository extends JpaRepository<Subscriber, Long> {
7}

服务层

定义服务类来处理业务逻辑:

java

深色版本

1import org.springframework.amqp.rabbit.core.RabbitTemplate;
2import org.springframework.beans.factory.annotation.Autowired;
3import org.springframework.stereotype.Service;
4
5@Service
6public class StockPriceService {
7    private final StockPriceRepository stockPriceRepository;
8    private final SubscriberRepository subscriberRepository;
9    private final RabbitTemplate rabbitTemplate;
10
11    @Autowired
12    public StockPriceService(StockPriceRepository stockPriceRepository,
13                             SubscriberRepository subscriberRepository,
14                             RabbitTemplate rabbitTemplate) {
15        this.stockPriceRepository = stockPriceRepository;
16        this.subscriberRepository = subscriberRepository;
17        this.rabbitTemplate = rabbitTemplate;
18    }
19
20    public void updatePrice(String symbol, double price) {
21        StockPrice stockPrice = stockPriceRepository.findBySymbol(symbol);
22        if (stockPrice == null) {
23            stockPrice = new StockPrice();
24            stockPrice.setSymbol(symbol);
25        }
26        stockPrice.setPrice(price);
27        stockPriceRepository.save(stockPrice);
28
29        notifySubscribers(symbol, price);
30    }
31
32    private void notifySubscribers(String symbol, double price) {
33        subscriberRepository.findAllBySymbol(symbol).forEach(subscriber -> {
34            rabbitTemplate.convertAndSend("stock-price-updates", "New price for " + symbol + ": " + price);
35        });
36    }
37}

控制器

创建一个REST控制器来接收股票价格更新请求:

java

深色版本

1import org.springframework.web.bind.annotation.PostMapping;
2import org.springframework.web.bind.annotation.RequestBody;
3import org.springframework.web.bind.annotation.RestController;
4
5@RestController
6public class StockPriceController {
7    private final StockPriceService stockPriceService;
8
9    @Autowired
10    public StockPriceController(StockPriceService stockPriceService) {
11        this.stockPriceService = stockPriceService;
12    }
13
14    @PostMapping("/update-price")
15    public void updatePrice(@RequestBody StockPriceUpdateRequest request) {
16        stockPriceService.updatePrice(request.getSymbol(), request.getPrice());
17    }
18}
19
20class StockPriceUpdateRequest {
21    private String symbol;
22    private double price;
23
24    // Getters and setters
25}

消息队列消费者

定义一个消费者来处理从RabbitMQ接收到的消息,并发送电子邮件通知订阅者:

java

深色版本

1import org.springframework.amqp.rabbit.annotation.RabbitListener;
2import org.springframework.stereotype.Component;
3
4@Component
5public class NotificationConsumer {
6    @RabbitListener(queues = "stock-price-updates")
7    public void receiveNotification(String message) {
8        System.out.println("Received notification: " + message);
9        // Here you can add code to send an email or other notifications
10    }
11}

测试

最后,我们可以编写一个简单的测试来验证系统的功能:

java

深色版本

1import org.junit.jupiter.api.Test;
2import org.springframework.beans.factory.annotation.Autowired;
3import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
4import org.springframework.boot.test.context.SpringBootTest;
5import org.springframework.test.web.servlet.MockMvc;
6
7import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
8import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
9
10@SpringBootTest
11@AutoConfigureMockMvc
12public class StockPriceControllerTest {
13    @Autowired
14    private MockMvc mockMvc;
15
16    @Test
17    public void testUpdatePrice() throws Exception {
18        mockMvc.perform(post("/update-price")
19                .content("{\"symbol\": \"AAPL\", \"price\": 150.0}")
20                .contentType("application/json"))
21                .andExpect(status().isOk());
22    }
23}

以上就是整个股票价格更新系统的设计和实现过程。你可以根据实际需求进一步扩展和完善这个系统,例如增加安全性、异常处理、更复杂的业务逻辑等。

标签:Spring,price,boot,Boot,private,springframework,org,股票价格,symbol
From: https://blog.csdn.net/h356363/article/details/141354873

相关文章

  • 跨域、JSONP、CORS、Spring、Spring Security解决方案
    概述JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。跨域是浏览器(如Chrome浏览器基于JSV8引擎,可以简单理解为JS解释器)的一种同源安全策略,是浏览器单方面限制脚本的跨域访问。因此,仅有客户端运行在浏览器时才存在跨域问题,才需要考虑如何解决这个问题。浏览器控制台......
  • Spring Mybatis拦截器配合logback打印完整sql语句
    在项目开发与维护过程中,常常需要对程序执行的sql语句,进行观察和分析。但是项目通常默认会使用org.apache.ibatis.logging.stdout.StdOutImpl日志配置,该配置是用System.out.println打印的日志,导致只能将执行语句打印到控制台,却没办法打印到日志文件中。如果放开logback日志等......
  • springboot+vue服装搭配推荐系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和个性化消费趋势的兴起,服装行业正经历着前所未有的变革。在海量商品面前,消费者往往面临选择困难,尤其是在服装搭配方面,如何根据个人喜好、身形特点以及场合需求快速找到最合适的搭配方案,成为众多消费者的迫切需......
  • springboot+vue扶贫助农与产品合作系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景在当前全球减贫事业与乡村振兴战略的双重背景下,扶贫助农已成为社会各界关注的焦点。随着信息技术的飞速发展,特别是互联网与电子商务的普及,为扶贫工作开辟了新路径。然而,农村地区由于信息不对称、物流成本高、销售渠道有限等问题,优质农......
  • springboot+vue峰数公司医疗设备管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着医疗技术的飞速发展,医疗设备的种类与数量日益增长,对医院运营管理提出了更高要求。峰数公司作为一家专注于医疗健康领域的企业,其业务范围广泛,涵盖从高端医疗设备供应到后期维护的全方位服务。然而,在传统管理模式下,设备信息散乱、管......
  • springboot+vue分类学科竞赛管理系统-后台2023【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着教育改革的深入和素质教育的全面推广,学科竞赛作为培养学生创新能力、实践能力和团队协作精神的重要途径,其重要性日益凸显。然而,传统的手工管理方式在应对日益增长的竞赛数量、复杂的竞赛分类及庞大的参赛学生信息时显得力不从心。......
  • 基于Springboot的宿舍管理系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的宿舍管理系统(有报告)。Javaee项目,springboot项目。资源下载:基于Springboot的宿舍管理系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven来实现。MyS......
  • 基于Springboot的疫情物资捐赠和分配系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的疫情物资捐赠和分配系统(有报告)。Javaee项目,springboot项目。资源下载:基于Springboot的疫情物资捐赠和分配系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+V......
  • (附源码)基于springboot的清华逸景闲置房租赁系统的设计与实现-计算机毕设 09065
    基于springboot的清华逸景闲置房租赁系统的设计与实现目 录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3系统开发创新之处1.4论文结构与章节安排2系统分析2.1可行性分析2.2 系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例......
  • SpringBoot统一异常处理
    简介在SpringBoot项目中实现统一的异常处理是一种常见的做法,这有助于保持代码的整洁并提供一致的错误响应格式。SpringBoot中的统一异常处理是一种机制,用于集中管理和格式化应用程序中抛出的所有异常。这种机制可以提高程序的健壮性和用户体验,同时简化开发过程。统一异......