知识改变命运! SpringBoot系列21-实现策略模式_猿份哥-lskyf博客社区

SpringBoot系列21-实现策略模式

猿份哥 9月前 ⋅ 1182 阅读 ⋅ 1 个赞

如何在spring boot 中使用@component 实现策略模式

1.在 Spring Boot 中实现策略模式可以使用 @Component 注解来将策略类标记为 Spring 的组件,并使用 @Autowired 注解将它们注入到容器中。

首先,需要创建一个接口来定义策略的公共行为,例如:

public interface Strategy {
   void execute();
}

然后,可以创建一些实现了该接口的策略类,例如:

@Component
public class StrategyA implements Strategy {
   @Override
   public void execute() {
      // 实现策略A的逻辑
   }
}

@Component
public class StrategyB implements Strategy {
   @Override
   public void execute() {
      // 实现策略B的逻辑
   }
}

最后,可以创建一个使用策略的类,并使用 @Autowired 注解将策略注入到该类中,例如:

@Component
public class Context {
   @Autowired
   private Strategy strategy;

   public void executeStrategy() {
      strategy.execute();
   }
}

在这种情况下,当 Spring 容器初始化时,会自动将 StrategyA 和 StrategyB 注入到 Context 中,并且可以使用 executeStrategy 方法来执行策略。

要使用具体的策略,可以使用 @Qualifier 注解来指定要使用的策略,例如:

@Autowired
@Qualifier("strategyA")
private Strategy strategy;

这样,在容器中找到的所有策略组件中,只会注入名称为 "strategyA" 的策略。

2.另一种实现策略模式的方法是使用 Spring 的 @Service 注解将策略类标记为服务,并使用 @Autowired 注解将它们注入到容器中。

首先,需要创建一个接口来定义策略的公共行为,例如:

public interface Strategy {
   void execute();
}

然后,可以创建一些实现了该接口的策略类,并使用 @Service 注解将它们标记为服务,例如:

@Service
public class StrategyA implements Strategy {
   @Override
   public void execute() {
      // 实现策略A的逻辑
   }
}

@Service
public class StrategyB implements Strategy {
   @Override
   public void execute() {
      // 实现策略B的逻辑
   }
}

最后,可以创建一个使用策略的类,并使用 @Autowired 注解将策略注入到该类中,例如:

@Component
public class Context {
   @Autowired
   private List<Strategy> strategies;

   public void executeStrategy(String strategyName) {
      for (Strategy strategy : strategies) {
         if (strategy.getClass().getSimpleName().equals(strategyName)) {
            strategy.execute();
            break;
         }
      }
   }
}

在这种情况下,当 Spring 容器初始化时,会自动将 StrategyA 和 StrategyB 注入到 Context 中,并且可以使用 executeStrategy 方法来执行策略。

要使用具体的策略,可以使用 @Qualifier 注解来指定要使用的策略,例如:

@Autowired
@Qualifier("strategyA")
private Strategy strategy;

这样,在容器中找到的所有策略

服务中,只会注入名称为 "strategyA" 的策略。

3.另一种实现策略模式的方法是使用 Spring 的 @Configuration 注解将策略类配置到容器中,并使用 @Bean 注解将策略类定义为 Bean。

首先,需要创建一个接口来定义策略的公共行为,例如:


public interface Strategy {
   void execute();
}

然后,可以创建一些实现了该接口的策略类,例如:

public class StrategyA implements Strategy {
   @Override
   public void execute() {
      // 实现策略A的逻辑
   }
}

public class StrategyB implements Strategy {
   @Override
   public void execute() {
      // 实现策略B的逻辑
   }
}

然后,可以使用 @Configuration 注解将这些策略类配置到容器中,并使用 @Bean 注解将它们定义为 Bean,例如:

@Configuration
public class StrategyConfiguration {
   @Bean
   public Strategy strategyA() {
      return new StrategyA();
   }

   @Bean
   public Strategy strategyB() {
      return new StrategyB();
   }
}

最后,可以在需要使用策略的类中使用 @Autowired 注解将策略注入到该类中,例如:

@Component
public class Context {
   @Autowired
   private Strategy strategyA;

   @Autowired
   private Strategy strategyB;

   public void executeStrategyA() {
      strategyA.execute();
   }

   public void executeStrategyB() {
      strategyB.execute();
   }
}

在这种情况下,当 Spring 容器初始化时,会自动将 StrategyA 和 StrategyB 注入到 Context 中,并且可以使用 executeStrategyA 和 executeStrategyB 方法来执行策略。

要使用具体的策

略,可以使用 @Qualifier 注解来指定要使用的策略,例如:

@Autowired
@Qualifier("strategyA")
private Strategy strategy;

这样,在容器中找到的所有策略 Bean 中,只会注入名称为 "strategyA" 的策略。

4.另外,还可以使用 Java 的 ServiceLoader 类来动态加载策略服务。ServiceLoader 是 Java 标准库中的一个类,它可以在类路径中查找所有实现了指定接口的类,并将它们加载到容器中。

为了使用 ServiceLoader 加载策略服务,需要在 META-INF/services 目录中创建一个名称为策略接口全限定名的文件,并在文件中指定要加载的策略服务的全限定名。例如,如果要加载的策略服务实现了 Strategy 接口,则需要在 META-INF/services 目录中创建一个名称为 com.example.Strategy 的文件,并在文件中指定要加载的策略服务的全限定名。

例如,假设有一个名为 StrategyA 的策略服务,它的全限定名为 com.example.StrategyA,那么可以在 META-INF/services/com.example.Strategy 文件中指定这个策略服务的全限定名:

com.example.StrategyA

然后,可以使用 ServiceLoader.load 方法来加载所有实现了 Strategy 接口的策略服务:

ServiceLoader<Strategy> strategies = ServiceLoader.load(Strategy.class);

最后,可以使用迭代器遍历加载的策略服务并执行它们的 execute 方法:

for (Strategy strategy : strategies) {
   strategy.execute();
}

5.总结

总的来说,使用 Spring 实现策略模式的方法有很多,可以根据具体的需求和场景选择合适的方法。重要的是要理解策略模式的基本思想,并灵活运用不同的方法来实现。````


全部评论: 0

    我有话说:

    Spring Boot系列5-定时任务-springboot整合quartz实现动态定时任务

    MyJob实现Job接口,重写execute方法在里面操作我们要执行的业务逻辑。 @Slf4j public class MyJob implements Job { @Autowired

    SpringBoot系列9-使用jasypt自定义stater运行时动态传入加密密码

    文章目录 1.新建springboot-encryption-configuration项目实现stater 2.pom文件引入jasypt 3.在resources/support/下配置

    Spring Boot系列1-helloword

      使用springboot简单轻松创建helloword SpringBoot系列1-helloword 关于springboot这是摘自官方的一段话 Spring Boot

    Spring Boot系列7-SpringBoot+mybatis+druid+TypeHandler

    介绍在SpringBoot中集成mybatis和druid以及自定义TypeHandler 创建数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------...

    Spring Boot系列6-SpringBoot中使用servlet

    介绍在SpringBoot中如何使用servlet pom.xml <dependency> <groupId>org.springframework.boot<

    SpringBoot系列19-防止重复请求,重复表单提交超级简单注解的实现之四(终极版II)

    前言: 根据最新spring boot:2.5.0版本和在《SpringBoot防止重复请求,重复表单提交超级简单的注解实现之四(终极版I)》之上化繁为简抽取更实用的代码,新增超时机制 防重复提交

    电脑win10如何设置护眼模式,减少蓝光对眼睛带来伤害?

    如何设置电脑护眼模式,减少蓝光对眼睛带来伤害? 1.诉求:电脑用久了眼睛疼痛或者干涩不已,试试设置电脑护眼模式,减少蓝光对眼睛带来伤害。 2.步骤 点击左下角window(开始)-->设置

    SpringBoot系列12-redis-pipeline keys模糊查询替代方案

    keys模糊查询遇到性能问题redis cup 99%以及解决方案 之前写过一篇文章 《java redis通过key模糊删除,批量删除,批量查询相关数据》,在项目中我也是这样使用的。刚开始还没有

    Spring Boot系列2-全局统一异常处理

    原创: 天空和唯美 天空唯美  点击查看原文 为什么要全局统一异常处理呢?如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当

    spring boot系列4-定时任务-springboot自带的scheduled超级简单

    需求:创建一个每天凌晨0点执行的定时任务1.创建任务 /** * @author 天空蓝蓝的 */ @Slf4j @EnableScheduling @Component public class MyTask { @Async @Schedul...

    SpringBoot系列20-项目启动后打印启动链接并使用浏览器打开指定页面

    原文链接: https://www.lskyf.com/post/1466 需求描述 开发时每次手动打开浏览器,然后输如url,打开相应的页面。感觉不太方便。可以实现打印启动链接并自动打开想要打开的

    SpringBoot系列10-文件上传

    文章目录 1.先来最简单的 2.设置文件大小,请求大小 3.多文件上传 怎样使用最简单的方式上传文件,如何上传多个文件呢 先来最简单的 pom.xml文件引入依赖文件 <dependencies> <dependenc...

    SpringBoot系列17-统一异常处理(包含简单的JSR303参数校验)

    原文链接:https://www.lskyf.com/post/211 方法1.通过ControllerAdvice实现+简单的JSR303参数校验实现 1.1 加入依赖 <

    SpringBoot系列15-mysql-multiple-data-sources1

    springboot 多数据源的一个简单示例 多数据源分包加载 新建数据库test1和表tbl_user CREATE TABLE `tbl_user` ( `id` int(11) NOT

    加入公众号
    加入公众号