策略+工厂模式与自动注入问题
先说结论 : 工厂+策略模式生成的策略 去执行 定义的方法的时候,不能进行自动注入
在使用工厂+策略模式时,策略对象通常是在运行时创建的,并且不是由Spring容器直接管理的bean。因此,如果策略对象在Spring容器外部创建,Spring容器无法自动注入依赖,包括mongoTemplate。在这种情况下,需要手动注入mongoTemplate到策略对象中。
以下是一种可能的方法来手动注入mongoTemplate到策略对象中:
- 在策略接口中定义一个方法,用于接受 - mongoTemplate作为参数:- 1 
 2
 3
 4- public interface PublishingStrategy { 
 void publish(Article article, MongoTemplate mongoTemplate);
 }
- 在每个策略类中实现该方法,接受 - mongoTemplate作为参数,并在方法内部使用它:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 public class ArticlePublishingStrategy implements PublishingStrategy {
 
 public void publish(Article article, MongoTemplate mongoTemplate) {
 // 业务代码省略...
 mongoTemplate.save(article);
 }
 }
- 在工厂类中,根据需要的策略类型创建策略对象,并手动将 - mongoTemplate注入到策略对象中:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 public class PublishingStrategyFactory {
 
 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
 public class PublishingStrategyFactory {
 private final Map<String, PublishingStrategy> strategyMap = new HashMap<>();
 
 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;
 }
 }
 
- 在使用策略的地方,首先从工厂中获取策略对象,然后手动传入 - 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 : 2025-02-26 00:52:31
- Link: https://cs7eric.github.io/2023/10/20/策略+工厂模式与自动注入问题/
- License: This work is licensed under CC BY-NC-SA 4.0.
        Comments