我在用策略模式实现业务的时候,具体的策略实现类就无法获取到bean

来源:6-5 不使用自动注入你还会获取上下文吗?(下)

弗兰克的IT生活

2020-09-09

场景描述
业务需要实现一个类似聚合支付到工具包,我通过自定义starter的方式实现,用策略模式,根据业务线上配置的yml的key来调用对应到实现,策略模式核心代码(丢失上下文的代码):

public class PayStrategyFactory {

    private static Map<String, PayStrategy> PAY_STRATEGY_MAP = new HashMap<>();

	// 可能是通过new具体策略,然后上下文就丢掉来,在具体的策略(比如WechatPayStrategy内就无法取到yml的信息了)
    static {
        PAY_STRATEGY_MAP.put(PayKey.ZHI_FU_BAO, new ZhiFuBaoPayStrategy());
        PAY_STRATEGY_MAP.put(PayKey.WECHAT, new WechatPayStrategy());
        PAY_STRATEGY_MAP.put(PayKey.BANK, new BankPayStrategy());
    }

    /**
     * 通过构造私有构造函数,达到不会被new的效果
     */
    private PayStrategyFactory() {

    }

    private static final PayStrategy NON_PAY = new EmptyPayStrategy();

    public static PayStrategy getPayStrategy(String payKey) {
        PayStrategy payStrategy = PAY_STRATEGY_MAP.get(payKey);
        return payStrategy == null ? NON_PAY : payStrategy;
    }

    private interface PayKey {
        String ZHI_FU_BAO = "ZHIFUBAO";
        String WECHAT = "WECHAT";
        String BANK = "BANK";
    }
}

项目地址:
github

心态崩了~~~

写回答

2回答

弗兰克的IT生活

提问者

2020-09-09

加了下面代码生效了- - ,为什么????

@Configurationpublic class ConfigClass {
   /**
    * spirng上下文获取类
    *
    * @return
    */
   @Bean()
   public SpringContextHolder SpringContextHolder() {
       return new SpringContextHolder();
   }}

0
0

弗兰克的IT生活

提问者

2020-09-09

我使用implements ApplicationContextAware 的方式获取上下文,但是setApplicationContext都没有执行

0
0

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

466 学习 · 204 问题

查看课程