spring中的IOC說明

Hanyta發表於2024-05-12
  1. 什麼是IOC?

    • 控制反轉,把物件建立和物件之間的呼叫過程交給spring進行管理,為了降低耦合度
  2. 兩種IOC介面

    • BeanFactory:IOC 容器基本實現,是 Spring 內部的使用介面,不提供開發人員進行使用載入配置檔案時候不會建立物件,在獲取物件(使用)才去建立物件
    • ApplicationContext:BeanFactory 介面的子介面,提供更多更強大的功能,一般由開發人員進行使用,載入配置檔案時候就會把在配置檔案物件進行建立。常用。
  3. 建立ApplicationContext介面例項通常採用ClassPathXmlApplicationContext建立

    //初始化Spring容器,載入配置檔案
    ApplicationContext applicationContext =
             new ClassPathXmlApplicationContext("bean.xml");
    //2、透過容器獲取userDao例項
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    
  4. spring配置檔案的編寫

    // Spring檔案建立Bean
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--讓指定類配置給Spring,讓Spring建立其物件的例項-->
        <bean id = "userDao" class="com.test.springTest.UserDaoImpl"/>
    </beans>
    
  5. 依賴注入

  • DI(依賴注入)與控制反轉(IOC)的具體實現,實現IOC思想需要DI做支援,就是在spring這個容器中,你需要將一些類交給spring容器進行管理,然後在你需要的時候,不是自己去定義,而是直接向spring容器索取,當spring容器知道你的需求之後,就會去它所管理的元件中進行查詢,然後直接給你所需要的元件。依賴:bean對像的建立依賴與容器,注入:bean物件的所有屬性,由容器來注入。
  1. 依賴注入的兩種方式:set注入,構造方法注入

    參考:https://blog.csdn.net/cold___play/article/details/100059134

    • 建構函式注入

      • user的有參構造
    package com.test.bean;
    
    public class User {
    	
    	private String name;
    	private Integer age;
    	private Car car;
    	
    	public User(String name, Car car) {
    		System.out.println("User(String name, Car car)!!");
    		this.name = name;
    		this.car = car;
    	}
    	
    	public User(Car car,String name) {
    		System.out.println("User(Car car,String name)!!");
    		this.name = name;
    		this.car = car;
    	}
    	
    	public User(Integer name, Car car) {
    		System.out.println("User(Integer name, Car car)!!");
    		this.name = name+"";
    		this.car = car;
    	}
    	
    	public Car getCar() {
    		return car;
    	}
    	public void setCar(Car car) {
    		this.car = car;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    	}
    }
    
    • applicationContext.xml配置:index:用於確定引數的位置,type:用於確定引數的型別,這兩個屬性可以完全確定一個建構函式。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- 將car物件配置到容器中 -->
    	<bean name="car" class="com.test.bean.Car" >
    		<property name="name" value="保時捷" ></property>
    		<property name="color" value="紅色" ></property>
    	</bean>
    
    	<!-- 建構函式注入 -->
       <bean name="user2" class="com.test.bean.User" >
    	<!-- name屬性: 建構函式的引數名
    		index屬性: 建構函式的引數索引
    		type屬性: 建構函式的引數型別  -->
    	  <constructor-arg name="name" value="24" index="0" type="java.lang.Integer"></constructor-arg>
    	  <constructor-arg name="car" ref="car" index="1" ></constructor-arg>
      </bean> 
    </beans>
    
    • set方法注入

      • 每一個實體類為其屬性寫上相應的set,get方法

      • applicationContext.xml中進行配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- set方式注入: -->
    	<bean  name="user" class="com.test.bean.User" >
    		<!--值型別注入: 為User物件中名為name的屬性注入tom作為值 -->
    		<property name="name" value="tom" ></property>
    		<property name="age"  value="18" ></property>
    		<!-- 引用型別注入: 為car屬性注入下方配置的car物件 -->
    		<property name="car"  ref="car" ></property>
    	</bean>
    	
    	<!-- 將car物件配置到容器中 -->
    	<bean name="car" class="pers.zhang.bean.Car" >
    		<property name="name" value="保時捷" ></property>
    		<property name="color" value="紅色" ></property>
    	</bean>
    </beans>
    
    • 複雜型別的注入

      • 建立一個CollectionBean類:
    package com.test.bean;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    
    public class CollectionBean {
    	private Object[] arr;//陣列型別注入
    	private List list;//list/set 型別注入
    	private Map map;//map型別注入
    	private Properties prop;//properties型別注入
    	
    	public Object[] getArr() {
    		return arr;
    	}
    	public void setArr(Object[] arr) {
    		this.arr = arr;
    	}
    	public List getList() {
    		return list;
    	}
    	public void setList(List list) {
    		this.list = list;
    	}
    	public Map getMap() {
    		return map;
    	}
    	public void setMap(Map map) {
    		this.map = map;
    	}
    	public Properties getProp() {
    		return prop;
    	}
    	public void setProp(Properties prop) {
    		this.prop = prop;
    	}
    	@Override
    	public String toString() {
    		return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop
    				+ "]";
    	}
    }
    
    • applicationContext.xml中進行配置:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- set方式注入: -->
    	<bean  name="user" class="com.test.bean.User" >
    		<!--值型別注入: 為User物件中名為name的屬性注入tom作為值 -->
    		<property name="name" value="tom" ></property>
    		<property name="age"  value="18" ></property>
    		<!-- 引用型別注入: 為car屬性注入下方配置的car物件 -->
    		<property name="car"  ref="car" ></property>
    	</bean>
    
        <bean name="car" class="pers.zhang.bean.Car" >
    		<property name="name" value="保時捷" ></property>
    		<property name="color" value="紅色" ></property>
    	</bean>
    
        <!-- 複雜型別注入 -->
        <bean name="cb" class="com.test.CollectionBean" >
            <!-- 陣列型別注入 -->
            <property name="arr">
                <!-- 元素順序與注入順序一致 -->
    		    <array>
    			    <value>tom</value>
    			    <value>jerry</value>
    			    <ref bean="user" />
    		    </array>
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
            <!-- list型別注入 -->
            <property name="list"  >
    		    <list>
    			    <value>jack</value>
    			    <value>rose</value>
    			    <ref bean="user" />
    		    </list>
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
           <!-- map型別注入 -->
    	    <property name="map"  >
    		    <map>
    			    <!-- 鍵為字串,值為字串 -->
    			    <entry key="url" value="jdbc:mysql ></entry>
    			    <!-- 鍵為字串,值為物件 -->
    			    <entry key="user" value-ref="user"  ></entry>
    			    <!-- 鍵為物件,值為物件 -->
    			    <entry key-ref="user2" value-ref="user2"  ></entry>
    		    </map> 
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
      		  <!-- prperties 型別注入 -->
    			<property name="prop"  >
    				<props>
    					<prop key="driverClass">com.jdbc.mysql.Driver</prop>
    					<prop key="userName">root</prop>
    					<prop key="password">1234</prop>
    				</props>
    			</property>
    	</bean>
    </beans>
    
    • 擴充套件注入方式

      • p名稱空間注入:走set方法
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- 將car物件配置到容器中 -->
    	<bean name="car" class="com.test.bean.Car" >
    		<property name="name" value="保時捷" ></property>
    		<property name="color" value="紅色" ></property>
    	</bean>
    
    <!-- p名稱空間注入, 走set方法
    	1.匯入P名稱空間  xmlns:p="http://www.springframework.org/schema/p"
    	2.使用p:屬性完成注入
    		|-值型別: p:屬性名="值"
    		|-物件型別: p:屬性名-ref="bean名稱"
     -->
    	<bean  name="user" class="com.test.bean.User" p:name="Jack" p:age="20" p:car-ref="car"  ></bean>
    </beans>
    
    • c名稱空間注入:走構造器方法

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      		xmlns="http://www.springframework.org/schema/beans"
      		xmlns:c="http://www.springframework.org/schema/c"
      		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
      
      	<!-- 將car物件配置到容器中 -->
      	<bean name="car" class="com.test.bean.Car" >
      		<property name="name" value="保時捷" ></property>
      		<property name="color" value="紅色" ></property>
      	</bean>
      
      <!-- c名稱空間注入, 走構造方法,要給定有參和無參的構造方法
      	匯入c名稱空間  xmlns:c="http://www.springframework.org/schema/c"
       -->
      	<bean  name="user" class="com.test.bean.User" c:name="Jack" c:age="20" ></bean>
      </beans>
      
        
    

相關文章