美文网首页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