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一起交流學習哦~