本節學習Spring的DI/IOC容器的6種注入方式。
準備工作,編寫基礎類:
Role.JAVA
package raky.train.entity;
public class Role {
private Integer id;
private String name;
public Role() {
}
public Role(Integer id, String name) {
this.id = id;
this.name = name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
}
User.java
package raky.train.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private String pass;
private Integer age;
private Role role;
}
1.setter注入
setter注入也叫設值注入,一般需要滿足的條件:無參構造器,私有屬性,setter方法。
配置文件代碼:
<!--type1: setter注入-->
<bean id="role1" class="raky.train.entity.Role">
<property name="id" value="1000" />
<property name="name" value="dev" />
</bean
<bean id="user1" class="raky.train.entity.User">
<property name="id" value="1000" /><!--注入:賦值-->
<property name="name" value="raky" />
<property name="pass" value="1234" />
<property name="age" value="18" />
<property name="role" ref="role1" /><!--注入:引用-->
</bean>
2.構造器注入
構造器注入,也叫構造方法注入,一般需要提供構造器(類型,個數,順序),私有屬性,推薦添加默認無參構造器。
配置文件代碼:
<!--type2: 構造器注入-->
<!--
constructor-arg 構造方法參數標簽
|==> name 參數名稱
|==> type 參數類型
|==> index 參數索引,從0開始
|==> value 參數賦值(常量)
|==> ref 參數引用(引用其他bean)
一般情況下,name屬性和index屬性二選一即可
-->
<bean id="role2" class="raky.train.entity.Role">
<constructor-arg name="id" type="java.lang.Integer" index="0" value="2000" />
<constructor-arg name="name" type="java.lang.String" index="1" value="lucy" />
</bean>
<bean id="user2" class="raky.train.entity.User" >
<constructor-arg name="id" value="2000" />
<constructor-arg name="name" value="jack" />
<constructor-arg name="pass" value="5678" />
<constructor-arg name="age" value="28" />
<constructor-arg name="role" ref="role2" />
</bean>
3.工廠類靜態方法注入
RoleFactory.java
package raky.train.factory;
import raky.train.entity.Role;
/**
* 角色工廠類
*/
public class RoleFactory {
//實例方法
public Role createRoleInstance2(){
return new Role(4000,"coco");
}
}
配置文件代碼:
<!--type3:工廠類靜態方法==>類方法-->
<bean id="role3" class="raky.train.factory.RoleFactory" factory-method="creatRoleInstance1" />
4.工廠類實例方法注入
RoleFactory.java
package raky.train.factory;
import raky.train.entity.Role;
/**
* 角色工廠類
*/
public class RoleFactory {
//實例方法
public Role createRoleInstance2(){
return new Role(4000,"coco");
}
}
配置文件代碼:
<!--type4:工廠類實例方法==>對象方法-->
<bean id="roleFactory" class="raky.train.factory.RoleFactory" />
<bean id="role4" factory-bean="roleFactory" factory-method="createRoleInstance2" />
5.p命名空間注入
p命名空間中的p即property屬性,本質上還是setter注入,必須要滿足setter的基本條件,此注入方式主要是簡化bean的配置。
配置規則如下:
//1.beans標簽添加p命名空間
xmlns:p="http://www.springframework.org/schema/p"
//2.配置方式
賦值: p:屬性="值"
引用: p:屬性-ref="bean"
配置文件代碼:
<!--type5:p命名空間注入-->
<bean id="user5" class="raky.train.entity.User" p:id="5000"
p:name="xxx" p:pass="xxx" p:age="33" p:role-ref="role5" />
<bean id="role5" class="raky.train.entity.Role" p:id="5000" p:name="test5" />
6.c命名空間注入
c命名空間中的c即constructor構造器,本質上還是構造器注入,必須要滿足構造注入的基本條件,此注入方式主要是簡化bean的配置。
配置規則如下:
//1.beans標簽添加c命名空間
xmlns:c="http://www.springframework.org/schema/c"
//2.配置方式
//2.1 屬性賦值:
c:屬性="值" 引用: c:屬性-ref="bean"
//2.2 索引賦值:
c:_索引="值" 引用: c:_索引-ref="bean"
配置文件代碼:
<!--type6: c命名空間注入-->
<!--
<bean id="user6" class="raky.train.entity.User" c:id="6000" c:name="yyy"
c:pass="yyy" c:age="55" c:role-ref="role6" />
<bean id="role6" class="raky.train.entity.Role" c:id="6000" c:name="test6" />
-->
<bean id="user6" class="raky.train.entity.User" c:_0="6000" c:_1="yyy"
c:_2="yyy" c:_3="55" c:_4-ref="role6" />
<bean id="role6" class="raky.train.entity.Role" c:_0="6000" c:_1="test6" />
測試結果如下:
至此,Spring的DI/IOC容器的6種注入方式的學習筆記整理完畢。希望對大家有幫助。越分享越快樂。