面試官:你給我講一下什麼是spring依賴注入?網友:就這啊,太簡單了!

什麼是依賴注入

  • 依賴 : 指Bean對象的創建依賴於容器 .
  • 注入 : 指Bean對象所依賴的資源 , 由容器來設置和裝配 .

依賴注入的類型有三類

  1. 基本數據類型和String類型
  2. 其他bean類型(在配置文件中或者註解配置過的bean)
  3. 複雜類型/集合類型

注入的方式有三種

  1. 使用構造函數注入
    構造函數方式注入:使用標籤constructor-arg
  • type:用於指定注入的數據類型
  • index:用於指定注入的數據給構造函數中指定索引位置的參數賦值,索引位置是從0開始
  • name:用於指定給構造函數中指定名稱的參數賦值(推薦使用)
  • value:用於提供基本類型和string類型數據賦值
  • ref:用於指定其他的bean數據類型,是指在spring容器中出現過的bean對象,引用id進來

測試:

實體類

public class User {
    private String name;
    private Integer age;
    private Date date;

    public User(){

    }

    public User(String name, Integer age, Date date) {
        this.name = name;
        this.age = age;
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

}

Spring核心配置文件beans.xml

   <bean id="user" class="com.Dao.User">
        <constructor-arg name="name" value="chenhui"></constructor-arg>
        <constructor-arg name="age" value="22"></constructor-arg>
        <constructor-arg name="date" ref="date"></constructor-arg>
    </bean>
    <bean id="date" class="java.util.Date"></bean>

測試類:

 @Test
    public void test(){
        //通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
        ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
       //獲取Spring容器中的bean對象,通過id和類字節碼來獲取
        User user = Context.getBean("user", User.class);
        System.out.println(user);
    }

結果:


  1. 使用set方法注入(常用)
  • 使用標籤property
  • name:用於指定注入時所調用的set方法名稱
  • value:用於提供基本類型和string類型數據賦值
  • ref:用於指定其他的bean數據類型,是指在spring容器中出現過的bean對象,引用id進來

要求被注入的屬性 , 必須有set方法 , set方法的方法名由set + 屬性首字母大寫 , 如果屬性是boolean類型 , 沒有set方法 , 是 is .

測試:

實體類

public class User {
    private String name;
    private Integer age;
    private Date date;

    public User(){

    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setDate(Date date) {
        this.date = date;
    }

}

Spring核心配置文件beans.xml

<!--    使用的是默認構造函數創建對象-->
    <bean id="user" class="com.Dao.User">
        <property name="name" value="chenhui"></property>
        <property name="age" value="22"></property>
        <property name="date" ref="date"></property>
     </bean>
    <bean id="date" class="java.util.Date"></bean>

測試類:

  @Test
    public void test(){
        //通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
        ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
       //獲取Spring容器中的bean對象,通過id和類字節碼來獲取
        User user = Context.getBean("user", User.class);
        System.out.println(user);
    }

結果:


複雜類型/集合類型的注入

  • 用於給list結構集合注入標籤:
  • list array set
  • 用於給map結構集合注入的標籤:
  • map property
  • 結構相同,標籤可以互換,即標籤體可以互換使用,不會報錯

測試:

實體類:

public class User {
    private String[] strings;
    private List<String> list;
    private Map map;
    private Properties properties;
    private Set set;

    public void setStrings(String[] strings) {
        this.strings = strings;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public User(){

    }

    public void print(){
        System.out.println(Arrays.toString(strings));
        System.out.println(list);
        System.out.println(map);
        System.out.println(set);
        System.out.println(properties);
    }
}

Spring核心配置文件beans.xml

<bean id="user" class="com.Dao.User">
        <property name="strings">
            <array>
                <value>dasd</value>
                <value>aaaa</value>
                <value>dfff</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>dff</value>
                <value>hjjgj</value>
                <value>dgfhfgh</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>1213</value>
                <value>1fsdf</value>
                <value>trg</value>
            </set>
        </property>
        <property name="map">
            <map>
<!--                使用第一種方式-->
                <entry key="chenhui" value="123"></entry>
                <entry key="xie" value="123"></entry>
<!--                也可使用第二種方式-->
                <entry key="chen">
                    <value>333</value>
                </entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="cc">1</prop>
                <prop key="ww">2</prop>
                <prop key="dsa">3</prop>
            </props>
        </property>
    </bean>

測試類:

 @Test
    public void test(){
        //通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
        ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
       //獲取Spring容器中的bean對象,通過id和類字節碼來獲取
        User user = Context.getBean("user", User.class);
        //調用方法使集合類型注入執行
        user.print();
    }

結果:

當結構相同,標籤可以互換

<bean id="user" class="com.Dao.User">
        <property name="strings">
            <set>
                <value>1213</value>
                <value>1fsdf</value>
                <value>trg</value>
            </set>

        </property>
        <property name="list">
            <array>
                <value>dasd</value>
                <value>aaaa</value>
                <value>dfff</value>
            </array>

        </property>
        <property name="set">
            <list>
                <value>dff</value>
                <value>hjjgj</value>
                <value>dgfhfgh</value>
            </list>
        </property>
        <property name="map">
            <props>
                <prop key="cc">1</prop>
                <prop key="ww">2</prop>
                <prop key="dsa">3</prop>
            </props>

        </property>
        <property name="properties">
            <map>
                <!--                使用第一種方式-->
                <entry key="chenhui" value="123"></entry>
                <entry key="xie" value="123"></entry>
                <!--                也可使用第二種方式-->
                <entry key="chen">
                    <value>333</value>
                </entry>
            </map>
        </property>
    </bean>

結果:
[圖片上傳中...(image-85fd26-1613912046687-0)]

最後

歡迎關注公衆號:前程有光,領取一線大廠Java面試題總結+各知識點學習思維導+一份300頁pdf文檔的Java核心知識點總結! 這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多線程併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java算法、數據庫、Zookeeper、分佈式緩存、數據結構等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章