Spring延遲依賴注入ObjectFactory/ObjectProvider


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/Spring-ObjectFactory-ObjectProvider


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM