ObjectProvider 继承自 ObjectFactory

  • ObjectFactory提早注入 (繁多类型注入/汇合类型注入)
  • ObjectProvider提早注入 (繁多类型注入/汇合类型注入) 举荐

实体类Rumenz/SuperRumenz

package com.rumenz;public class Rumenz{    private Integer id;    private String name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Rumenz{" +                "id=" + id +                ", name='" + name + '\'' +                '}';    }}package com.rumenz;public class SuperRumenz extends Rumenz {    private String type;    public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }    @Override    public String toString() {        return "SuperRumenz{" +                "type='" + type + '\'' +                "} " + super.toString();    }}

配置文件Beans.xml

<?xml version="1.0" encoding="UTF-8"?><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 id="rumenz" class="com.rumenz.Rumenz">        <property name="id" value="123"/>        <property name="name" value="入门小站"/>    </bean>    <bean id="superRumenz" class="com.rumenz.SuperRumenz" parent="rumenz" primary="true">        <property name="id" value="456"/>        <property name="name" value="入门小站-子类"/>        <property name="type" value="1"/>    </bean></beans>

调用

package com.rumenz;import org.springframework.beans.factory.ObjectFactory;import org.springframework.beans.factory.ObjectProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Arrays;import java.util.Set;public class DemoApplication  {    //繁多类型注入,同一种类型存在多个,会抉择primary="true"注入    @Autowired    private ObjectFactory<Rumenz> rumenz;    //繁多类型输出,应用Qualifier抉择特定的Bean    @Autowired    @Qualifier("rumenz")    private ObjectProvider<Rumenz> rumenz1;    //汇合类型注入    @Autowired    private ObjectProvider<Set<Rumenz>> set1;    //汇合类型注入    @Autowired    private ObjectFactory<Set<Rumenz>> set2;       public static void main(String[] args) {        AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();        XmlBeanDefinitionReader xr=new XmlBeanDefinitionReader(ac);        xr.loadBeanDefinitions("Beans.xml");                ac.register(DemoApplication.class);        ac.refresh();        DemoApplication demoApplication = ac.getBean(DemoApplication.class);        System.out.println(demoApplication.rumenz.getObject().getName());        System.out.println(demoApplication.rumenz1.getObject().getName());        Set<Rumenz> lists1 = demoApplication.set1.getIfAvailable();        System.out.println(Arrays.toString(lists1.toArray()));        Set<Rumenz> lists2 = demoApplication.set2.getObject();        System.out.println(Arrays.toString(lists2.toArray()));        ac.close();    }}

输入

入门小站-子类入门小站[Rumenz{id=123, name='入门小站'}, SuperRumenz{type='1'} Rumenz{id=456, name='入门小站-子类'}][Rumenz{id=123, name='入门小站'}, SuperRumenz{type='1'} Rumenz{id=456, name='入门小站-子类'}]

源码:https://github.com/mifunc/Spr...