1. 程式人生 > >Spring基礎之屬性注入總結

Spring基礎之屬性注入總結

spring是開源的輕量級框架,核心主要兩部分:

(1)aop:面向切面程式設計,擴充套件功能不是修改原始碼實現

(2)ioc:控制反轉,

- 比如有一個類,在類裡面有方法(不是靜態的方法),呼叫類裡面的方法,建立類的物件,使用物件呼叫方法,建立類物件的過程,需要new出來物件

- 把物件的建立不是通過new方式實現,而是交給spring配置建立類物件

spring也是一站式框架

(1)spring在javaee三層結構中,每一層都提供不同的解決技術

- web層:springMVC

- service層:spring的ioc

- dao層:spring的jdbcTemplate

Spring中對bean標籤的管理:

Spring裡邊是通過配置檔案來建立物件的,即其有IOC控制反轉機制,每一個bean的例項化就是在建立一個物件。bean例項化有三種實現方式:

(1)使用類的無參建構函式來建立(重點)

比如說有一個User類:

package cn.itcast.ioc;

public class User {
	
	private String username;
	
	public User() {
		
	}
	
}

則只需要在核心配置檔案中:

<bean id="user" class="cn.ywq.User" ></bean> 

即可完成物件的建立(bean的例項化),若User類中沒有無參構造,則會報異常。

(2)使用靜態工廠建立:

建立靜態的方法,返回類物件

package cn.ywq.bean;

public class Bean2Factory {

	//靜態的方法,返回Bean2物件
	public static Bean2 getBean2() {
		return new Bean2();
	}
}
<bean id="bean2" class="cn.ywq.bean.Bean2Factory" factory-method="getBean2"></bean>


(3)使用例項工廠建立

建立不是靜態的方法,返回類物件 n

package cn.ywq.bean;

public class Bean3Factory {

	//普通的方法,返回Bean3物件
	public Bean3 getBean3() {
		return new Bean3();
	}
}
<bean id="bean3Factory" class="cn.ywq.bean.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>



Bean標籤的常用屬性:

(1)id屬性:起名稱,id屬性值名稱任意命名
-
id屬性值,不能包含特殊符號
- 根據id值得到配置物件

(2)class屬性:建立物件所在類的全路徑

(3)name屬性:功能和id屬性一樣的,id屬性值不能包含特殊符號,但是在name屬性值裡面可以包含特殊符號

(4)scope屬性
- singleton:預設值,單例
- prototype:多例
 - request:建立物件把物件放到request域裡面
- session:建立物件把物件放到session域裡面
- globalSession:建立物件把物件放到globalSession裡面

 屬性注入:

上邊介紹了通過配置檔案,有三種方法可以實現物件的建立,那麼如何向物件的屬性中設定值呢?這就需要用到注入的方法。

屬性注入的方式介紹(三種方式)
(1)使用set方法注入
(2)使用有引數構造注入
(3)使用介面注入

在spring框架裡面,支援前兩種方式

(1)set方法注入(重點)

(2)有引數構造注入

有參構造注入:

package cn.ywq.property;

public class PropertyDemo1 {

	private String username;

	public PropertyDemo1(String username) {
		this.username = username;
	}
	
	public void test1() {
		System.out.println("demo1.........."+username);
	}
	
}

配置檔案:

<!-- 使用有引數構造注入屬性 -->
    <bean id="demo" class="cn.itcast.property.PropertyDemo1"> 
		<!-- 使用有參構造注入 -->
		<constructor-arg name="username" value="小王小馬"></constructor-arg>
	</bean> 	


使用set方法注入屬性(重點):

package cn.ywq.property;

public class Book {

	private String bookname;
	//set方法
	public void setBookname(String bookname) {
		this.bookname = bookname;
	}
	
	public void demobook() {
		System.out.println("book..........."+bookname);
	}
}

配置檔案:

<!-- 使用set方法注入屬性 -->
	<bean id="book" class="cn.itcast.property.Book"> 
		<!-- 注入屬性值 
			name屬性值:類裡面定義的屬性名稱
			value屬性:設定具體的值
		-->
		<property name="bookname" value="易筋經"></property>
	</bean> 

前面屬性注入都是將簡單的字串作為屬性注入到了某個物件中,那麼如何注入物件型別的屬性呢?(重點)
我們以Service中得到Dao物件為例來進行演示。

建立service類和dao類:
(1)在service得到dao物件

具體實現過程:
(1)在service裡面把dao作為型別屬性
(2)生成dao型別屬性的set方法

UserService.java

package cn.ywq.ioc;

public class UserService {

	//1 定義dao型別屬性
	private UserDao userDao;
	//2 生成set方法
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	public void add() {
		System.out.println("service.........");

		userDao.add();
	}

}


UserDao.java

package cn.ywq.ioc;

public class UserDao {

	public void add() {
		System.out.println("dao.........");
	}
}


配置檔案:

<!-- 注入物件型別屬性 -->
	<!-- 1 配置service和dao物件 -->
	<bean id="userDao" class="cn.ywq.ioc.UserDao"></bean> 	
	<<bean id="userService" class="cn.ywq.ioc.UserService">
		<!--  注入dao物件 
			name屬性值:service類裡面屬性名稱
			         現在不要寫value屬性,因為剛才是字串,現在是物件
			寫ref屬性:dao配置bean標籤中id值 -->
		
		<property name="userDao" ref="userDao"></property>
	</bean> 

注入複雜型別屬性

如何注入複雜型別屬性呢?複雜型別包括:陣列、list集合、map集合以及properties型別。

舉例:在User物件中注入各種複雜型別屬性。

<!-- 注入複雜型別屬性值 -->
	<bean id="user" class="cn.ywq.property.User">
		<!-- 陣列 -->
		<property name="arrs">
			<list>
				<value>小王</value>
				<value>小馬</value>
				<value>小宋</value>
			</list>
		</property>
		
		<!-- list -->
		<property name="list">
			<list>
				<value>小奧</value>
				<value>小金</value>
				<value>小普</value>
			</list>			
		</property>
		
		<!-- map -->
		<property name="map">
			<map>
				<entry key="aa" value="lucy"></entry>
				<entry key="bb" value="mary"></entry>
				<entry key="cc" value="tom"></entry>
			</map>
		</property>
		
		<!-- properties -->
		<property name="properties">
			<props>
				<prop key="driverclass">com.mysql.jdbc.Driver</prop>
				<prop key="username">root</prop>
			</props>
		</property>
	</bean>



IOC(控制反轉)和DI(依賴注入)的關係:

(1)IOC: 控制反轉,把物件建立交給spring進行配置

(2)DI: 依賴注入,向類裡面的屬性中設定值

(3)關係:依賴注入不能單獨存在,需要在ioc基礎之上完成操作
 

 如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~