Spring3實戰第二章第二小節 IOC依賴注入 list和map集合


Spring有多種依賴注入的形式,本篇文章僅介紹Spring通過xml進行IOC配置的方式。

 平常的Java開發中,程序員在某個類中需要依賴其它類的方法。

    通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理。

    Spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過Spring容器幫我們new指定實例並且將實例注入到需要該對象的類中。

    依賴注入的另一種說法是"控制反轉"。通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員。

    而控制反轉是指new實例工作不由我們程序員來做而是交給Spring容器來做。

 

構造器注入:  本文使用構造器注入和引用了一個bean

先寫出需要引用的bean的接口

package com.spring;

public interface SpringAocInterface {
    void show();
}

實現接口

package com.spring;

public class SpringAocInterfaceIm implements SpringAocInterface {
	
	private final static String Lings = "最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。";
	@Override
	public void show() {
	
	System.out.println(Lings);
		
	}

}

需要注入的類 (提供了一個String屬性和一個對象  都是通過構造方法注入)

package com.spring;

/**
 * 使用構造方法
 * @author Administrator
 *
 */
public class SpringIoc {
    private String Song;  //構造方法注入
    
    private SpringAocInterface springAocInterface; //構造方法引入對象注入

    public SpringIoc(String song, SpringAocInterface springAocInterface) {
        super();
        Song = song;
        this.springAocInterface = springAocInterface;
    }
    
    public void show() {
        System.out.println("構造方法傳入的Song為 :" +Song);
        System.out.print("構造方法引入的對象為:");
        springAocInterface.show();
    }
    
    
    
}

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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-3.0.xsd
                     http://www.springframework.org/schema/aop
                     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                     http://www.springframework.org/schema/tx
                     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        <!-- 構造方法注入 -->
     <bean id="SpringIoc" class="com.spring.SpringIoc">
     	<constructor-arg  name="song" value="5"></constructor-arg>  <!-- 給SpringIoc中的song屬性注入-->
     	<constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 給SpringIoc中的springAocInterface 注入bean -->
     </bean>
     <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
<beans>

寫一個測試類

package com.spring.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.SpringIoc;

public class SpringIocTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        SpringIoc bean = (SpringIoc) context.getBean("SpringIoc");
        bean.show();
    }
}

輸出結果

十月 15, 2017 10:19:50 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e3bd51: startup date [Sun Oct 15 22:19:50 CST 2017]; root of context hierarchy
十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring.xml]
十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e40e825: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy
構造方法傳入的Song為 :5
構造方法引入的對象為:最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。

2:set注入(里面包括set注入 屬性  list集合  map集合  引入bean)

package com.spring;

import java.util.List;
import java.util.Map;

/**
 * Spring通過Set注入
 * @author Administrator
 *
 */
public class SpringSetIoc {
    private String name;
    
    private  int age;
    
    private SpringAocInterface like;
    
    private List<Object> list; 
    
    private Map<String, Object> map ;
    
    public void show() {
        System.out.println("通過set方法注入的姓名為:" + name);
        System.out.println("通過set方法注入的年齡為:" + age);
        System.out.print("通過set方法注入對象" + name + "最喜歡的一句話為:");
        like.show();
        System.out.print("通過set方法注入" + name + "最喜歡吃的水果為:");
        for (Object object : list) {
            System.out.print(object + ",");
        }
        System.out.println();
        System.out.print("通過set方法注入map key為string : ");
        for (String m : map.keySet()) {
            System.out.print(map.get(m) + ",");
        }
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public SpringAocInterface getLike() {
        return like;
    }

    public void setLike(SpringAocInterface like) {
        this.like = like;
    }

    public List<Object> getList() {
        return list;
    }

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

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
    
    
    
}

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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-3.0.xsd
                     http://www.springframework.org/schema/aop
                     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                     http://www.springframework.org/schema/tx
                     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
       
     <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
     <!-- set注入 -->
       <bean id="SpringSetIoc" class="com.spring.SpringSetIoc">
          <property name="name" value="張三"></property>
          <property name="age" value="18"></property>
      <!--     <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 這個是注入公共bean  如果需要注入內部bean 並不想被共享可以使用下面的注入方式   -->
          <property name="like">
              <bean class="com.spring.SpringAocInterfaceIm"></bean>
          </property>
          <property name="list">  <!-- 這個是注入list集合 這個是注入的值  如果想注入bean的話  可以 寫成  <ref bean = "bean的名稱"></ref> -->
              <list>
                  <value>香蕉</value>
                  <value>橘子</value>
                  <value>蘋果</value>
              </list>
          </property>
          <property name="map"><!-- map注入 -->
              <map>
                  <entry key="男士" value="李四"></entry>
                  <entry key="男士" value="王五"></entry>
                  <entry key="女士" value="小花"></entry>
              </map>
          </property>
      </bean> 
      <!-- spring還提供了P命名空間  減少了尖括號  使用p命名空間的時候  需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 這句代碼 不然會報錯  兩者方法取其一就好  我使用的上面的方式-->
      <!--  <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "張三" 
       p:age = "18" 
       p:like-ref="SpringAocInterfaceIm"/> -->
</beans>

測試類

package com.spring.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.SpringSetIoc;

public class SpringSetIocTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        SpringSetIoc bean = (SpringSetIoc) context.getBean("SpringSetIoc");
        bean.show();
    }
}

輸出結果

十月 15, 2017 10:26:14 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7f1633fd: startup date [Sun Oct 15 22:26:14 CST 2017]; root of context hierarchy
十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring.xml]
十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@741c42a9: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy
通過set方法注入的姓名為:張三
通過set方法注入的年齡為:18
通過set方法注入對象張三最喜歡的一句話為:最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。
通過set方法注入張三最喜歡吃的水果為:香蕉,橘子,蘋果,
通過set方法注入map key為string : 王五,小花,

最后奉上完整版的xml配置文件 包含構造注入和set注入

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-3.0.xsd
                     http://www.springframework.org/schema/aop
                     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                     http://www.springframework.org/schema/tx
                     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        <!-- 構造方法注入 -->
     <bean id="SpringIoc" class="com.spring.SpringIoc">
         <constructor-arg  name="song" value="5"></constructor-arg>  <!-- 給SpringIoc中的song屬性注入-->
         <constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 給SpringIoc中的springAocInterface 注入bean -->
     </bean>
     <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
     <!-- set注入 -->
       <bean id="SpringSetIoc" class="com.spring.SpringSetIoc">
          <property name="name" value="張三"></property>
          <property name="age" value="18"></property>
      <!--     <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 這個是注入公共bean  如果需要注入內部bean 並不想被共享可以使用下面的注入方式   -->
          <property name="like">
              <bean class="com.spring.SpringAocInterfaceIm"></bean>
          </property>
          <property name="list">  <!-- 這個是注入list集合 這個是注入的值  如果想注入bean的話  可以 寫成  <ref bean = "bean的名稱"></ref> -->
              <list>
                  <value>香蕉</value>
                  <value>橘子</value>
                  <value>蘋果</value>
              </list>
          </property>
          <property name="map"><!-- map注入 -->
              <map>
                  <entry key="男士" value="李四"></entry>
                  <entry key="男士" value="王五"></entry>
                  <entry key="女士" value="小花"></entry>
              </map>
          </property>
      </bean> 
      <!-- spring還提供了P命名空間  減少了尖括號  使用p命名空間的時候  需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 這句代碼 不然會報錯 -->
      <!--  <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "張三" 
       p:age = "18" 
       p:like-ref="SpringAocInterfaceIm"/> -->
</beans>

 


免責聲明!

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



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