SpringBoot 使用策略模式动态调用 Service

1. 项目目录

在这里插入图片描述

2. pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.3</version>
</dependency>

3. 创建测试类

TestController

package com.cnbai.controller;

import com.cnbai.service.ServiceContext;
import com.cnbai.service.TaskService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class TestController {

    @Resource
    private ServiceContext serviceContext;

    @GetMapping("/test")
    public void test(@RequestParam("type") String type) {
        TaskService taskService = serviceContext.getTaskService(type);
        taskService.task();
    }
}

4. 创建 Service

TaskService

package com.cnbai.service;

import org.springframework.stereotype.Service;

/**
 * 动态调用 service 父接口
 */
@Service
public interface TaskService {

    void task();
}

ServiceContext

package com.cnbai.service;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 动态调用 service 处理类
 */
@Service
public class ServiceContext {

    @Resource
    private Map<String, TaskService> serviceMap;

    public TaskService getTaskService(String type) {
        return serviceMap.get(type);
    }
}

UserService

package com.cnbai.service.impl;

import com.cnbai.service.TaskService;
import org.springframework.stereotype.Service;

@Service("user")
public class UserService implements TaskService {

    @Override
    public void task() {
        System.out.println("user");
    }
}

PersonService

package com.cnbai.service.impl;

import com.cnbai.service.TaskService;
import org.springframework.stereotype.Service;

@Service("person")
public class PersonService implements TaskService {

    @Override
    public void task() {
        System.out.println("person");
    }
}

5. 创建启动类

application

package com.cnbai;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class application {

    public static void main(String[] args) {
        SpringApplication.run(application.class, args);
    }
}

6. 测试

http://localhost:8080/test?type=user
http://localhost:8080/test?type=person

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我给你讲一下如何在Spring Boot中实现策略模式。 首先,我们需要定义一个接口或者抽象类,用于定义策略模式中的抽象行为。以一个简单的计算器为例,我们可以定义一个`Calculator`接口,其中包含一个`calculate`方法: ```java public interface Calculator { int calculate(int a, int b); } ``` 然后,我们需要定义具体的策略类,实现`Calculator`接口。假设我们有两种计算方式:加法和乘法,我们可以分别定义两个实现类: ```java @Component public class AddCalculator implements Calculator { @Override public int calculate(int a, int b) { return a + b; } } @Component public class MultiplyCalculator implements Calculator { @Override public int calculate(int a, int b) { return a * b; } } ``` 在上面的代码中,我们使用了`@Component`注解将这两个类注册为Spring Bean,以便在其他地方可以自动注入它们。 接下来,我们需要一个Context类,用于选择具体的策略类。在Spring Boot中,我们可以使用`@Autowired`注解自动注入所有实现了`Calculator`接口的Bean,并使用`@Qualifier`注解来指定具体的实现类。例如: ```java @Service public class CalculatorService { @Autowired private List<Calculator> calculators; public int calculate(String operator, int a, int b) { for (Calculator calculator : calculators) { if (calculator.getClass().getSimpleName().equalsIgnoreCase(operator)) { return calculator.calculate(a, b); } } throw new IllegalArgumentException("Invalid operator: " + operator); } } ``` 在上面的代码中,我们使用了一个`List<Calculator>`来注入所有实现了`Calculator`接口的Bean。然后,我们在`calculate`方法中根据传入的运算符选择具体的策略类,并调用它的`calculate`方法进行计算。 最后,我们可以在Controller中使用`CalculatorService`类来实现具体的业务逻辑。例如: ```java @RestController public class CalculatorController { @Autowired private CalculatorService calculatorService; @GetMapping("/calculate") public int calculate(@RequestParam String operator, @RequestParam int a, @RequestParam int b) { return calculatorService.calculate(operator, a, b); } } ``` 在上面的代码中,我们使用了`@RequestParam`注解来接收请求参数,然后调用`CalculatorService`的`calculate`方法进行计算,并返回结果。 这就是在Spring Boot中实现策略模式的方法。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值