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