策略+工厂模式与自动注入问题
先说结论 : 工厂+策略模式生成的策略 去执行 定义的方法的时候,不能进行自动注入
在使用工厂+策略模式时,策略对象通常是在运行时创建的,并且不是由Spring容器直接管理的bean。因此,如果策略对象在Spring容器外部创建,Spring容器无法自动注入依赖,包括mongoTemplate
。在这种情况下,需要手动注入mongoTemplate
到策略对象中。
以下是一种可能的方法来手动注入mongoTemplate
到策略对象中:
在策略接口中定义一个方法,用于接受
mongoTemplate
作为参数:1
2
3
4public 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
2PublishingStrategy 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