本节学习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;
}
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>
构造器注入,也叫构造方法注入,一般需要提供构造器(类型,个数,顺序),私有属性,推荐添加默认无参构造器。
配置文件代码:
<!--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>
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" />
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" />
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" />
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种注入方式的学习笔记整理完毕。希望对大家有帮助。越分享越快乐。