一、基础环境搭建
1,导包
当前只是spring初始阶段,只使用spring最核心的包及相关支持。spring关系如图所示:
最终,导入项目的包结构如图所示:
2,创建对象
public class Worker {
// 姓名
private String name;
// 薪水
private Integer salary;
public void setName(String name) {
this.name = name;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Worker [name=" + name + ", salary=" + salary + "]";
}
}
3,书写配置注册对象到容器
创建xml文件注册对象到容器,原则上命名和路径没有指定,推荐在src目录下创建applicationContext.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<bean name="worker" class="com.future.domain.Worker"></bean>
</beans>
4,代码测试
创建测试类,并书写测试代码:
public class TestDemo {
/*
* 整体流程
* 1,导包
* 2,构建bean类
* 3,将bean与spring关联【配置】
* 4,获取bean对象并使用
*/
@Test
public void test() {
// 创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//从spring中获取对象
Worker worker = (Worker) ac.getBean("worker");
//使用对象
System.out.print("worker:"+worker);
//引出:构造方法的调用,属性初始化
}
}
展示结果如图所示,表示存储对象及对象调用成功。
二、创建对象的方式
1,通过空参构造方法创建对象
如上面简单实例,已经使用空参构造方法创建对象。为使bean类更趋于完善,添加初始化及销毁方法。
// 添加初始化/销毁方法
public void init() {
System.out.println("初始化方法!");
}
public void destory() {
System.out.println("销毁方法!");
}
<bean name="worker1" class="com.future.domain.Worker" init-method="init"
destroy-method="destory">
</bean>
2,静态工厂方法
(1)工厂类的实现
public class WorkerFactory {
// 静态工厂
public static Worker createWorker1() {
System.out.println("静态工厂创建Worker");
return new Worker();
}
// 实例工厂
public Worker createWorker2() {
System.out.println("实例工厂创建Worker");
return new Worker();
}
}
(2)配置文件的修改
<!-- 2:静态工厂方法 -->
<bean name="worker2" class="com.future.create.WorkerFactory"
factory-method="createWorker1">
</bean>
如2所展示,实例工厂方法实现如上,当前修改配置文件实现即可。
<!-- 3:实例工厂方法 -->
<bean name="worker3"
factory-bean="WorkerFactory"
factory-method="createWorker2">
</bean>
<bean name="WorkerFactory"
class="com.future.create.WorkerFactory">
</bean>
三、属性注入
为以下功能的完善实现,为基础bean类添加bean属性对象。并完善对应构造方法,包含空参,部分参数,部分参数调整位置,全参数构造方法。最后调整实现bean类如下:
public class Worker {
// 姓名
private String name;
// 薪水
private Integer salary;
// 添加对象型成员变量
private House house;
public void setName(String name) {
this.name = name;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
// 添加构造函数
public Worker() {
System.out.println("Worker空参构造方法");
}
// 添加初始化/销毁方法
public void init() {
System.out.println("初始化方法!");
}
public void destory() {
System.out.println("销毁方法!");
}
// 对象型成员变量
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
@Override
public String toString() {
return "Worker [name=" + name + ", salary=" + salary + ", house="
+ house + "]";
}
// 创建带参构造方法
public Worker(String name, Integer salary) {
System.out.println("带参顺序构造方法");
this.name = name;
this.salary = salary;
}
public Worker(Integer salary,String name) {
System.out.println("带参混乱顺序构造方法");
this.name = name;
this.salary = salary;
}
public Worker(Integer salary,String name,House house) {
System.out.println("全参构造方法");
this.name = name;
this.salary = salary;
this.house = house;
}
}
其中,bean类属性的类对象实现如下:
public class House {
//地标
private String place;
//地段
private String location;
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "House [place=" + place + ", location=" + location + "]";
}
}
<!-- set方法注入 -->
<bean name="worker1" class="com.future.domain.Worker">
<property name="name" value="zhangsan"></property>
<property name="salary" value="16000"></property>
<!-- 对象型属性,引用配置好对象 -->
<property name="house" ref="house"></property>
</bean>
<bean name="house" class="com.future.domain.House">
<property name="place" value="上地华联"></property>
<property name="location" value="上地创业大厦"></property>
</bean>
2,通过构造方法注入
<!-- 构造函数注入 -->
<bean name="worker2" class="com.future.domain.Worker">
<!-- name属性: 构造函数的参数名 -->
<!-- index属性: 构造函数的参数索引 -->
<!-- type属性: 构造函数的参数类型 -->
<constructor-arg name="name" index="1" type="java.lang.String"
value="lisi"></constructor-arg>
<constructor-arg name="salary" index="0"
type="java.lang.Integer" value="999"></constructor-arg>
<constructor-arg name="house" ref="house" index="2"></constructor-arg>
</bean>
引入p空间:
xmlns:p="http://www.springframework.org/schema/p"
<!-- p名称空间注入, 走set方法
1.导入P名称空间 xmlns:p="http://www.springframework.org/schema/p"
2.使用p:属性完成注入 |-值类型: p:属性名="值" |-对象类型: p:属性名-ref="bean名称" -->
<bean name="worker3" class="com.future.domain.Worker" p:name="jack"
p:salary="20000" p:house-ref="house">
</bean>
<!-- spel注入: spring Expression Language sping表达式语言 -->
<bean name="worker4" class="com.future.domain.Worker">
<property name="name" value="#{worker2.name}"></property>
<property name="salary" value="#{worker3.salary}"></property>
<property name="house" ref="house"></property>
</bean>
(1)复杂数据的bean对象实现
//复杂数据类型注入
public class CollectionBean {
//数组
private String[] arr;
//集合
private List list;
//key-value
private Map map;
//属性
private Properties prop;
public String[] getArr() {
return arr;
}
public void setArr(String[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProp() {
return prop;
}
public void setProp(Properties prop) {
this.prop = prop;
}
@Override
public String toString() {
return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list
+ ", map=" + map + ", prop=" + prop + "]";
}
}
(2)数据注入实现
<bean name="collectionBean" class="com.future.domain.CollectionBean">
<!-- 数组 -->
<property name="arr">
<array>
<value>hello</value>
<value>world</value>
<value>javaEE</value>
</array>
</property>
<!-- list 集合 -->
<property name="list">
<list>
<value>画画</value>
<value>唱歌</value>
<value>写字</value>
<value>冥想</value>
</list>
</property>
<!-- key-value -->
<property name="map">
<map>
<entry key="脸为什么黄了" value="防冷涂的蜡"></entry>
<entry key="天王盖地虎" value="宝塔镇河妖"></entry>
</map>
</property>
<!-- 属性值 -->
<property name="prop">
<props>
<prop key="用户名">root</prop>
<prop key="密码">123456</prop>
<prop key="验证码">天上掉下个林妹妹</prop>
</props>
</property>
</bean>
整体数据注入测试类实现:
//测试注入属性
public class TestInjection {
// set方法注入
@Test
public void test1() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"/com/future/injection/applicationContext.xml");
Worker worker1 = (Worker) ac.getBean("worker1");
System.out.println("worker1:" + worker1);
}
// 构造方法注入
@Test
public void test2() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"/com/future/injection/applicationContext.xml");
Worker worker2 = (Worker) ac.getBean("worker2");
System.out.println("worker2:" + worker2);
}
// p名称空间注入
@Test
public void test3() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"/com/future/injection/applicationContext.xml");
Worker worker3 = (Worker) ac.getBean("worker3");
System.out.println("worker3:" + worker3);
}
// spel注入
@Test
public void test4() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"/com/future/injection/applicationContext.xml");
Worker worker4 = (Worker) ac.getBean("worker4");
System.out.println("worker4:" + worker4);
}
// 复杂数据注入
@Test
public void test5() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"/com/future/injection/applicationContext.xml");
CollectionBean collectionBean = (CollectionBean) ac
.getBean("collectionBean");
System.out.println("collectionBean:" + collectionBean);
}
}
其中部分测试结果:
爱在左,情在右,走在生命的两旁。随时撒种,随时开花,将这一路长径点缀得花香弥漫,使穿枝拂叶的行人,踏着荆棘,不觉得痛苦,有泪可落,却不是凄凉。