spring bean实例注入到map 集合中

说明

1、动态获取bean实例、根据不同的beanName获取不同的bean
2、根据不同的策略获取不懂的bean实例【策略模式】

背景:

在项目经常会使用到,不同的角色调用不同的业务方法,实现不同的逻辑,如果使用 if (roleType = 1) { 角色1逻辑 } else if(roleType = 2) { 角色2逻辑} …,这样的代码看起来比较臃肿; 使用策略模式,调用不同的bean实例,不同的业务逻辑,这样代码看起来就舒畅很多

配置

1、一个实例工厂,如:FruitsFactory 【使用@Autowired注入bean实例到Map集合】
2、一个接口,如:Fruits
3、Fruits对应的实现类,如:AppleImpl、OrangeImpl、…

demo如下

1 实例工厂

@Service
@RequiredArgsConstructor
@Slf4j
public class FruitsFactory {

//    @Autowired
//    private Map<String, Fruits> beans = new ConcurrentHashMap<>(3);
    private final Map<String, Fruits> beans;

    public Fruits getBean(String beanName) {
        Fruits shuiGuo = beans.get(beanName);
        return shuiGuo;
    }

    /**
     * 打印bean相关信息
     * @author kazaf @date 2022/11/15 10:15
     */
    public void printBeans() {
        for (Map.Entry<String, Fruits> temp : beans.entrySet()) {
            String beanName = temp.getKey();
            Fruits fruits = temp.getValue();
            String result = fruits.eat(beanName);
            log.info("beanName={},result>:{}", beanName, result);
        }
    }
}

2 接口

public interface Fruits {


    String eat(String name);
//    int insert();
//    int update();
//    int select();
}

3 实现类


@Service("type.orange") // bean名称也可以使用枚举
public class OrangeImpl implements Fruits {

    @Override
    public String eat(String name) {
        return "橘子我要吃"+name;
    }
}

@Service("type.apple")
public class AppleImpl implements Fruits {
    @Override
    public String eat(String name) {
        return "苹果我要吃"+name;
    }
}

4 调用类,controller或其他类都行

  • eatFruits 方法,传入不同的bean名称,执行不同的逻辑
  • printBeans 方法 打印结果:
    beanName=type.apple,result>:苹果我要吃type.apple
    beanName=type.orange,result>:橘子我要吃type.orange

@Slf4j
@Validated
@RestController
@RequestMapping("test")
@RequiredArgsConstructor
public class TestRest {

    private final FruitsFactory fruitsFactory; // 水果工厂

    @GetMapping("eatFruits")
    public String eatFruits(@RequestParam String type) {

        log.info("---eatFruits.param>:type={}", type);
        String result = fruitsFactory.getBean(type).eat("");
        return result;
    }

    /**
     * 打印bean
     * @author kazaf @date 2022/11/15 10:00
     * @return java.lang.String
     */
    @GetMapping("printBeans")
    public String printBeans() {

        fruitsFactory.printBeans();
        return "success";
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值