目录
在我们开发工作中,一般是使用@Autowired,@Resource,xml配置等来实现单个实例等依赖注入。然而,当我们需要注入的是一个集合对象的时候,我们要怎么操作呢?
实际的使用场景可能是这样的,我需要把某个接口的全部实现都注入到一个工厂实例中,然后根据条件返回对应的实例。那如何实现呢?话不多说,上代码
-
@Autowired方式
@Autowired
private Map<String, TestInterface> injectMap;
@Autowired
private List<TestInterface> injectList;
以上两个用法,会将实现类TestInterface接口的所有实现类,注入到属性当中。如果是Map,则会把实例的名称赋值给map的key,实例对象复制给value。如果实例对象指明了名称,则会给指定的名称,否则会给定Spring自动生成的名称。
-
@Resource方式
这个方式和@Autowired的使用方法一样。
-
xml注解方式
xml注解方式,有两种
使用autowire属性
自动绑定属性,设置成功后,会按照设置的策略去注入对象的属性值。
<!-- 创建策略工厂 -->
<bean name="greetStrategyFactory" class="com.local.mytest.disgnModle.StrategyModel2.GreetStrategyFactory" autowire="byType"/>
这个属性值有一下几个枚举:
default:如果在bean上指定了default,则它会去beans标签上去找default-autowire属性
no:不匹配,但是bean必须定义ref元素
byName:根据名字匹配(如果容器里没有该name的bean,则该属性为null)
byType:根据类型匹配(如果同时找多个相同类型的bean,则报错)
constructor:根据构造器匹配(很少使用)
使用util插件
util是xml配置的插件,需要引入xml文件头。我这里直接给出
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!-- 测试实例 -->
<bean name="testReal1" class="com.local.mytest.TestReal1"/>
<bean name="testReal2" class="com.local.mytest.TestReal2"/>
<bean name="testReal3" class="com.local.mytest.TestReal3"/>
<!-- 创建策略工厂 -->
<bean name="testGetBeanFactory" class="com.local.TestGetBeanFactory">
<!-- Map配置方式 -->
<property name="testRealMap">
<util:map>
<entry key="testReal1" value-ref="testReal1"/>
<entry key="testReal2" value-ref="testReal2"/>
<entry key="testReal3" value-ref="testReal3"/>
</util:map>
</property>
<!-- List配置方式 -->
<property name="testRealList">
<util:list>
<ref bean="testReal1"/>
<ref bean="testReal2"/>
<ref bean="testReal3"/>
</util:list>
</property>
</bean>
</beans>