美文网首页SpringFrameworkSpring 开发Spring Boot
spring List Map注入&抽象类注入

spring List Map注入&抽象类注入

作者: 殷天文 | 来源:发表于2018-03-06 10:43 被阅读249次

    翻看之前项目代码,发现一段这样的注入,将抽象类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即可。

    相关文章

      网友评论

        本文标题:spring List Map注入&抽象类注入

        本文链接:https://www.haomeiwen.com/subject/pwhkfftx.html