策略+工厂模式与自动注入问题

cccs7 Lv5

先说结论 : 工厂+策略模式生成的策略 去执行 定义的方法的时候,不能进行自动注入

在使用工厂+策略模式时,策略对象通常是在运行时创建的,并且不是由Spring容器直接管理的bean。因此,如果策略对象在Spring容器外部创建,Spring容器无法自动注入依赖,包括mongoTemplate。在这种情况下,需要手动注入mongoTemplate到策略对象中。

以下是一种可能的方法来手动注入mongoTemplate到策略对象中:

  1. 在策略接口中定义一个方法,用于接受mongoTemplate作为参数:

    1
    2
    3
    4
    public interface PublishingStrategy {

    void publish(Article article, MongoTemplate mongoTemplate);
    }
  2. 在每个策略类中实现该方法,接受mongoTemplate作为参数,并在方法内部使用它:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Component
    public class ArticlePublishingStrategy implements PublishingStrategy {

    @Override
    public void publish(Article article, MongoTemplate mongoTemplate) {
    // 业务代码省略...
    mongoTemplate.save(article);
    }
    }
  3. 在工厂类中,根据需要的策略类型创建策略对象,并手动将mongoTemplate注入到策略对象中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Component
    public class PublishingStrategyFactory {

    @Autowired
    private MongoTemplate mongoTemplate;

    public PublishingStrategy createStrategy(String articleType) {
    if (ArticleInfo.PUBLISH_TYPE_ARTICLE.equals(articleType)) {
    return new ArticlePublishingStrategy();
    } else if (ArticleInfo.PUBLISH_TYPE_ANSWER.equals(articleType)) {
    return new IssueAnswerStrategy();
    } else {
    throw new IllegalArgumentException("Invalid article type");
    }
    }
    }
    • 使用 Map 管理策略

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      @Component
      public class PublishingStrategyFactory {

      private final Map<String, PublishingStrategy> strategyMap = new HashMap<>();

      @Autowired
      public PublishingStrategyFactory(List<PublishingStrategy> strategies) {
      strategies.forEach(strategy -> strategyMap.put(strategy.getArticleType(), strategy));
      }

      public PublishingStrategy createStrategy(String articleType) {
      PublishingStrategy strategy = strategyMap.get(articleType);
      if (strategy == null) {
      throw new IllegalArgumentException("Invalid article type");
      }
      return strategy;
      }
      }
  4. 在使用策略的地方,首先从工厂中获取策略对象,然后手动传入mongoTemplate

    1
    2
    PublishingStrategy strategy = publishingStrategyFactory.createStrategy("article");
    strategy.publish(article, mongoTemplate);

这样,就可以在策略对象中使用mongoTemplate了,我们手动将它传递给了策略对象。这种方法绕开了Spring自动注入,允许在策略对象中使用依赖。

  • Title: 策略+工厂模式与自动注入问题
  • Author: cccs7
  • Created at: 2023-10-20 22:48:22
  • Updated at: 2023-10-20 23:24:09
  • Link: https://blog.cccs7.icu/2023/10/20/策略+工厂模式与自动注入问题/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
策略+工厂模式与自动注入问题