天天看點

spring詳解:spring IOC依賴注入的幾種方式準備屬性注入的兩種方式注入外部bean内部bean注入P名稱空間注入注入複雜資料類型

依賴注入(Dependency Injection)是用于實作控制反轉(Inversion of Control)的最常見的方式之一,本文詳細接收依賴注入各種資料類型和多種方法

準備

準備的兩個類:User、Student

User類有三個屬性,和兩個構造器

package cn.mym.entity;

public class User {
	private Integer userId;
	private String username;
	private String password;
	
	public User(Integer userId, String username, String password) {
		this.userId = userId;
		this.username = username;
		this.password = password;
	}
	
	public User(){}		//預設構造器再次顯示的聲明
	
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [userId=" + userId + ", username=" + username
				+ ", password=" + password + "]";
	}
           

Student中有自定義引用類型、複雜類型的準備

package cn.mym.entity;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Student {
	
	private User user;			//引用類型的注入

	private String[] arr;		//數組類型注入
	
	private List<String> list;	//List類型注入

	private Set<String> set;		//Set類型注入
	
	private Map<String,Integer> map;	//Map類型注入
	
	private Properties pro;			//Properties類型注入
	
	/**示範構造器注入引用類型*/
	public Student(User user){
		this.user = user;
	}
    
        public Student(){}        //顯示聲明預設構造器

     //===========setter方法  由于篇幅問題,省略了 用來擷取資料的getter方法===================
	
	public void setUser(User user) {
		this.user = user;
	}
	
	public void setArr(String[] arr) {
		this.arr = arr;
	}

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

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

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

	public void setPro(Properties pro) {
		this.pro = pro;
	}

 }
           

屬性注入的兩種方式

setter方法注入

User類中的幾個屬性的注入,幾個屬性都需要有setter方法

配置:

<bean id="user" class="cn.mym.entity.User">
        	<!-- 注入user對象中的屬性 -->
        	<property name="userId" value="10"></property>
        	<property name="username" value="123mmm"></property>
        	<property name="password" value="456yyy"></property>
 </bean>
           

測試:

@Test
public void test() {
	User user = (User) ac.getBean("user");
	System.out.println(user);
}
           

結果:輸出:User [userId=10, username=123mmm, password=456yyy]

構造器注入

構造器注入基本封裝類型--注入常量

配置:

<!-- 構造器注入基本封裝類型 -->
       <bean id="user1" class="cn.mym.entity.User">
        	<constructor-arg index="0" value="20"/>
        	<constructor-arg index="1" value="123m"/>
        	<constructor-arg index="2" value="456y"/>
        </bean>
           

測試輸出:User [userId=20, username=123m, password=456y]

構造器注入自定義引用類型的屬性--注入變量

用Student的對象建立示範構造器注入User類型屬性

配置:

<!-- 構造器注入自定義引用類型-變量 -->
        <bean id="stu" class="cn.mym.entity.Student">
        	<!-- 
        		通過構造器方式指定注入的bean
        		type:要注入的bean類型全名
        		ref:就是要注入的bean
         	-->
        	<constructor-arg index="0" type="cn.mym.entity.User" ref="user1"/>
        </bean>
           

測試:

@Test
	public void test() {
		Student stu = (Student) ac.getBean("stu");
		System.out.println(stu.getUser());
	}
           

輸出:User [userId=20, username=123m, password=456y]

注入外部bean

注入外部bean也就是注入自定義引用類型的屬性,這裡使用Student類來說明注入user屬性

配置:

<bean id="stu1" class="cn.mym.entity.Student">
        	<!-- name:要注入的屬性
        		ref:注入的bean的id,此user1已經配置好
        	 -->
        	<property name="user" ref="user1"></property>
        </bean>
           

測試:

@Test
	public void test() {
		Student stu = (Student) ac.getBean("stu1");
		System.out.println(stu.getUser());
	}
           

結果:User [userId=120, username=stu1123m, password=stu1456y]

内部bean注入

即要注入的bean在内部定義

配置:

<!-- 注入内部bean -->
        <bean id="stu2" class="cn.mym.entity.Student">
        	<property name="user">
        		<bean class="cn.mym.entity.User">
        			<!-- user的屬性注入-這裡為了篇幅注入一個 -->
        			<property name="username" value="one"></property>
        		</bean>
        	</property>
        </bean>
           

測試:

@Test
	public void test() {
		Student stu = (Student) ac.getBean("stu2");
		System.out.println(stu.getUser());
	}
           

結果:User [userId=null, username=one, password=null]

P名稱空間注入

 p 名稱空間給對象的屬性注入值(spring3.0以上版本才支援)

通過User類bean的建立來說明

配置:

首先限制要聲明p名稱空間:

xmlns:p="http://www.springframework.org/schema/p"
           

建立bean:

<!-- p名稱空間注入 -->
 <bean id="user2" class="cn.mym.entity.User" p:username="pName"/>
           

測試:

@Test
	public void testUser() {
		User user = (User) ac.getBean("user2");
		System.out.println(user);
	}
           

結果:User [userId=null, username=pName, password=null]

注入複雜資料類型

注入數組

注入Set集合

注入List集合

注入Map集合

注入Properties類型

<!-- 注入複雜資料類型 -->
        <bean id="stu3" class="cn.mym.entity.Student">
        	<property name="arr">
        		<list>
        			<value>a1</value>
        			<value>a2</value>
        		</list>
        	</property>
        	<property name="list">
        		<list>
        			<value>l1</value>
        			<value>l2</value>
        		</list>
        	</property>
        	<property name="set">
        		<set>
        			<value>s1</value>
        			<value>s2</value>
        		</set>
        	</property>
        	<property name="map">
        		<map>
        			<entry key="m1" value="123"/>
        			<entry key="m2" value="456"/>
        		</map>
        	</property>
        	<property name="pro">
        		<props>
        			<prop key="p1" >777</prop>
        			<prop key="p2" >999</prop>
        		</props>
        	</property>
        </bean>
           

測試:

@Test
	public void testStu() {
		Student stu = (Student) ac.getBean("stu3");
		System.out.println(stu.getArr());
		System.out.println(stu.getList());
		System.out.println(stu.getSet());
		System.out.println(stu.getMap());
		System.out.println(stu.getPro());
	}
           

結果:

[Ljava.lang.String;@6e9ba4a9

[l1, l2]

[s1, s2]

{m1=123, m2=456}

{p2=999, p1=777}

小結:以上就是全部的依賴注入各種資料類型的多種方式,常用的就是通過setter方法進行注入,是以說過,一個類的屬性想要通過spring進行注入,需要提供:無參構造器+屬性的setter方法

spring的再次回顧總結,若有詳述不當之處,感謝您私信糾正