spring List Map注入&抽象类注入

翻看之前项目代码,发现一段这样的注入,将抽象类PaymentPlugin所有的子类注入到集合中

    @Inject
    private List<PaymentPlugin> paymentPlugins = new ArrayList<>();
    @Inject
    private Map<String, PaymentPlugin> paymentPluginMap = new HashMap<>();

全局搜索之后并没有发现关于这两处的配置,这究竟是如何实现的?

后来在搜索引擎和实践的帮助下发现,spring可以将一个接口或者抽象类的所有实现类注入到List和Map中,只要在子类上加入注解声明交由spring容器托管。

//抽象父类
public abstract class PaymentPlugin {
}
//子类
@Component("weixinPublicPaymentPlugin")
public class WeixinPublicPaymentPlugin extends PaymentPlugin {
}
@Component("t")
public class T extends PaymentPlugin {
}
//接口
public interface PluginService {
}
//实现类
@Service
public class PluginServiceImpl implements PluginService {
}

测试代码如下

@Controller("testController")
public class Test {
    
    @Resource(name="weixinPublicPaymentPlugin")
    private PaymentPlugin paymentPlugin;
    @Inject
    private List<PaymentPlugin> paymentPlugins = new ArrayList<>();
    @Inject
    private Map<String, PaymentPlugin> paymentPluginMap = new HashMap<>();
    @Inject
    private List<PluginService> pluginServices = new ArrayList<>();
    @Inject
    private Map<String, PluginService> pluginServiceMap = new HashMap<>();
    
    @RequestMapping("/test")
    @ResponseBody
    public void test() {
        System.out.println("注入单实例:"+paymentPlugin);
        System.out.println("抽象集合list:"+paymentPlugins);
        System.out.println("抽象集合map:"+paymentPluginMap);
        System.out.println("接口集合list:"+pluginServices);
        System.out.println("接口集合map:"+pluginServiceMap);
    }
}

打印结果如下

注入单实例:com.taven.web.plugin.weixinPublicPayment.WeixinPublicPaymentPlugin@e7fdf9a3
抽象集合list:[com.taven.web.plugin.T@2e9, com.taven.web.plugin.weixinPublicPayment.WeixinPublicPaymentPlugin@e7fdf9a3]
抽象集合map:{t=com.taven.web.plugin.T@2e9, weixinPublicPaymentPlugin=com.taven.web.plugin.weixinPublicPayment.WeixinPublicPaymentPlugin@e7fdf9a3}
接口集合list:[com.taven.web.service.impl.PluginServiceImpl@2055ec87]
接口集合map:{pluginServiceImpl=com.taven.web.service.impl.PluginServiceImpl@2055ec87}

我在上网查询相关资料的时候发现,有的博客说spring无法注入抽象类,实测上述配置下,spring可以对抽象类进行注入,多个实现类,用name指定需要注入的bean即可。



作者:殷天文
链接:https://www.jianshu.com/p/428015df3ac1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值