1、概念

依赖注入:Dependency Injection(简称DI注入)。它是 spring 框架核心 ioc 的具体实现。 简单理解:可以在一个类中不通过new的方式依赖其它对象。目的是为了解耦。

PS:工程依旧沿用02课程的,maven和applicationContet.xml可以直接去02复制粘贴。

2、构造方法注入属性

2.1 创建Phone对象

public class Phone {

}

2.2 调整Student类。学生拥有姓名、年龄和手机。

public class Student {
private String name;
private Integer age;
private Phone phone; public Student(String name, Integer age, Phone phone) {
this.name = name;
this.age = age;
this.phone = phone;
System.out.println("I'm " + name + ", age " + age + ", phone " + phone);
} public Phone getPhone() {
return phone;
} public void setPhone(Phone phone) {
this.phone = phone;
} public void say() {
System.out.println("I'm a Student");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

2.3 修改applicationContext.xml文件装配Student的bean标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--
1. spring会通过反射的方式创建对象,并将该对象以key和value的方式存入到IOC容器中。
2. bean标签的id就是key,vaule就是类的全路径
3. 通过bean标签将对象创建并存入到IOC容器中的方式,我们可以称之为装配bean
4. 只要可以正常new出来的对象,都可以通过这种方式装配到IOC容器中
-->
<!-- 装配Phone对象到IOC容器中 -->
<bean id="phone" class="com.demo.domain.Phone"/> <!-- 装配Studnt对象到IOC容器中 -->
<bean id="student" class="com.demo.domain.Student">
<!--
constructor-arg标签:
name属性:指定参数在构造函数中的名称,指定给谁赋值
value属性:只能是基本数据类型和String类型的
ref属性:指定其它bean类型,且必须在IOC容器中
-->
<constructor-arg name="name" value="zhangsan"/>
<constructor-arg name="age" value="21"/>
<constructor-arg name="phone" ref="phone"/> </bean> <!-- 使用静态工厂方法将Teacher对象装配到IOC容器中 -->
<bean id="teacher" class="com.demo.factory.StaticFactory" factory-method="createTeacher"/> <!-- 使用实例工厂方法实例化bean -->
<!-- 1. 装配实例工厂-->
<bean id="instanceFactory" class="com.demo.factory.InstanceFactory"/>
<!-- 2. 使用实例工厂创建cat对象-->
<bean id="cat" factory-bean="instanceFactory" factory-method="createCat"/> </beans>

2.4 运行方法

3、Setter方法注入

3.1 修改Teacher类

public class Teacher {

    private String name;

    private Integer age;

    private Phone phone;

    public Phone getPhone() {
return phone;
} public void setPhone(Phone phone) {
this.phone = phone;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public void say() {
System.out.println("I'm a teacher. name: " + name + ", age: " + age + ", phone: " + phone);
}
}

3.2 修改applicationContext.xml中装配Teacher对象的bean标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--
1. spring会通过反射的方式创建对象,并将该对象以key和value的方式存入到IOC容器中。
2. bean标签的id就是key,vaule就是类的全路径
3. 通过bean标签将对象创建并存入到IOC容器中的方式,我们可以称之为装配bean
4. 只要可以正常new出来的对象,都可以通过这种方式装配到IOC容器中
-->
<!-- 装配Phone对象到IOC容器中 -->
<bean id="phone" class="com.demo.domain.Phone"/> <!-- 装配Studnt对象到IOC容器中 -->
<bean id="student" class="com.demo.domain.Student">
<!--
constructor-arg标签:
name属性:指定参数在构造函数中的名称,指定给谁赋值
value属性:只能是基本数据类型和String类型的
ref属性:指定其它bean类型,且必须在IOC容器中
-->
<constructor-arg name="name" value="zhangsan"/>
<constructor-arg name="age" value="21"/>
<constructor-arg name="phone" ref="phone"/> </bean> <!-- 使用静态工厂方法将Teacher对象装配到IOC容器中 -->
<bean id="teacher" class="com.demo.factory.StaticFactory" factory-method="createTeacher">
<!--
property标签
name属性:找的类中set方法后面的部分
value属性:给属性赋值是基本数据类型和String类型的
ref:给属性赋值是其他bean类型的。
-->
<property name="name" value="lisi"/>
<property name="age" value="25"/>
<property name="phone" ref="phone"/>
</bean> <!-- 使用实例工厂方法实例化bean -->
<!-- 1. 装配实例工厂-->
<bean id="instanceFactory" class="com.demo.factory.InstanceFactory"/>
<!-- 2. 使用实例工厂创建cat对象-->
<bean id="cat" factory-bean="instanceFactory" factory-method="createCat"/> </beans>

3.3 运行getTeaccherObjectFromSrpingIoc方法

PS:我们看到打印了两句话。为什么?

  这是因为加载配置文件的时候,初始化对象装配到IOC容器中,由于Student对象是有参构造,并且在构造方法中打印了一句话。

4、P名称空间注入

4.1 在applicationContext.xml文件中添加P名称空间

xmlns:p="http://www.springframework.org/schema/p"

4.2 修改cat类


public class Cat {
private String name;
private Integer age;
private Phone phone; public String getName() {
return name;
} public Phone getPhone() {
return phone;
} public void setPhone(Phone phone) {
this.phone = phone;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public void say() {
System.out.println("I'm a cat. name: " + name + ", age: " + age + ", phone: " + phone);
}
}

4.3 修改applicationContext.xml文件中装配cat对象bean标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:p="http://www.springframework.org/schema/p"> <!--
1. spring会通过反射的方式创建对象,并将该对象以key和value的方式存入到IOC容器中。
2. bean标签的id就是key,vaule就是类的全路径
3. 通过bean标签将对象创建并存入到IOC容器中的方式,我们可以称之为装配bean
4. 只要可以正常new出来的对象,都可以通过这种方式装配到IOC容器中
-->
<!-- 装配Phone对象到IOC容器中 -->
<bean id="phone" class="com.demo.domain.Phone"/> <!-- 装配Studnt对象到IOC容器中 -->
<bean id="student" class="com.demo.domain.Student">
<!--
constructor-arg标签:
name属性:指定参数在构造函数中的名称,指定给谁赋值
value属性:只能是基本数据类型和String类型的
ref属性:指定其它bean类型,且必须在IOC容器中
-->
<constructor-arg name="name" value="zhangsan"/>
<constructor-arg name="age" value="21"/>
<constructor-arg name="phone" ref="phone"/> </bean> <!-- 使用静态工厂方法将Teacher对象装配到IOC容器中 -->
<bean id="teacher" class="com.demo.factory.StaticFactory" factory-method="createTeacher">
<!--
property标签
name属性:找的类中set方法后面的部分
value属性:给属性赋值是基本数据类型和String类型的
ref:给属性赋值是其他bean类型的。
-->
<property name="name" value="lisi"/>
<property name="age" value="25"/>
<property name="phone" ref="phone"/>
</bean> <!-- 使用实例工厂方法实例化bean -->
<!-- 1. 装配实例工厂-->
<bean id="instanceFactory" class="com.demo.factory.InstanceFactory"/>
<!-- 2. 使用实例工厂创建cat对象-->
<bean id="cat" factory-bean="instanceFactory" factory-method="createCat" p:name="tom" p:age="21"
p:phone-ref="phone"/> </beans>

4.4 运行getCatObjectFromSrpingIoc方法

5、复杂类型的注入

5.1 创建HelloWorld实体类

import java.util.*;

public class HelloWorld {
private String[] myArrays;
private List<String> myList;
private Set<String> mySet;
private Map<String, String> myMap;
private Properties myProps; public String[] getMyArrays() {
return myArrays;
} public void setMyArrays(String[] myArrays) {
this.myArrays = myArrays;
} public List<String> getMyList() {
return myList;
} public void setMyList(List<String> myList) {
this.myList = myList;
} public Set<String> getMySet() {
return mySet;
} public void setMySet(Set<String> mySet) {
this.mySet = mySet;
} public Map<String, String> getMyMap() {
return myMap;
} public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
} public Properties getMyProps() {
return myProps;
} public void setMyProps(Properties myProps) {
this.myProps = myProps;
} public void sayHello() {
System.out.println("Hello World!");
System.out.println(Arrays.toString(myArrays));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps); }
}

5.2 在applicationContext.xml中装配HelloWorld对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:p="http://www.springframework.org/schema/p"> <!--
1. spring会通过反射的方式创建对象,并将该对象以key和value的方式存入到IOC容器中。
2. bean标签的id就是key,vaule就是类的全路径
3. 通过bean标签将对象创建并存入到IOC容器中的方式,我们可以称之为装配bean
4. 只要可以正常new出来的对象,都可以通过这种方式装配到IOC容器中
-->
<!-- 装配Phone对象到IOC容器中 -->
<bean id="phone" class="com.demo.domain.Phone"/> <!-- 装配Studnt对象到IOC容器中 -->
<bean id="student" class="com.demo.domain.Student">
<!--
constructor-arg标签:
name属性:指定参数在构造函数中的名称,指定给谁赋值
value属性:只能是基本数据类型和String类型的
ref属性:指定其它bean类型,且必须在IOC容器中
-->
<constructor-arg name="name" value="zhangsan"/>
<constructor-arg name="age" value="21"/>
<constructor-arg name="phone" ref="phone"/> </bean> <!-- 使用静态工厂方法将Teacher对象装配到IOC容器中 -->
<bean id="teacher" class="com.demo.factory.StaticFactory" factory-method="createTeacher">
<!--
property标签
name属性:找的类中set方法后面的部分
value属性:给属性赋值是基本数据类型和String类型的
ref:给属性赋值是其他bean类型的。
-->
<property name="name" value="lisi"/>
<property name="age" value="25"/>
<property name="phone" ref="phone"/>
</bean> <!-- 使用实例工厂方法实例化bean -->
<!-- 1. 装配实例工厂-->
<bean id="instanceFactory" class="com.demo.factory.InstanceFactory"/>
<!-- 2. 使用实例工厂创建cat对象-->
<bean id="cat" factory-bean="instanceFactory" factory-method="createCat" p:name="tom" p:age="21"
p:phone-ref="phone"/> <!-- 装配HelloWorld对象到IOC容器中 -->
<bean id="helloWorld" class="com.demo.domain.HelloWorld">
<property name="myArrays">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<property name="myList">
<list>
<value>CCC</value>
<value>DDD</value>
<value>EEE</value>
</list>
</property>
<property name="mySet">
<set>
<value>FFF</value>
<value>GGG</value>
<value>HHH</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="name1" value="III"/>
<entry key="name2" value="JJJ"/>
<entry key="name3" value="KKK"/>
</map>
</property>
<property name="myProps">
<props>
<prop key="name1">LLL</prop>
<prop key="name2">MMM</prop>
<prop key="name3">NNN</prop>
</props>
</property>
</bean>
</beans>

5.3 测试

    @Test
public void getHelloWorldObjectFromSrpingIoc() {
//从SpringIOC容器中获取HelloWorld对象 //1. 根据bean的id去IOC容器中获取HelloWorld对象
HelloWorld helloWorld = (HelloWorld) ac.getBean("helloWorld");
//2. 调用helloWolrd中的sayHello()方法
helloWorld.sayHello();
}

03-Spring基于xml的IOC配置--spring的依赖注入的更多相关文章

  1. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  2. 01Spring基于xml的IOC配置--入门

    01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...

  3. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  4. 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门

    创建新项目 修改为jar包的方式 把上一个工程内的代码 java下的com复制过来 由于配置文件没有,所以一运行就会报错 factory文件夹整个删除 dao的实现类 这里删除 测试类保留这两行代码 ...

  5. Spring基于XML的IOC环境搭建及入门

    一.使用Maven构建Java项目 * 项目目录结构 1. 在sun.service包下创建UserDao接口和接口实现类: UserDao接口: package sun.service; /** * ...

  6. Spring 基于注解的 IOC 配置

    创建 spring 的 的 xml 配置 文件 <context:component-scan base-package="com.itheim"/> 指定创建容器时要 ...

  7. Spring基于XML的IoC

    Maven导入Spring依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...

  8. Spring基于构造函数和设值函数的依赖注入

    基于构造函数的依赖注入 我们知道,bean标签中指定的类会进行初始化,这个初始化过程中自然会调用构造函数,那我们也可以利用这个构造函数完成依赖注入. 先创建一个类: public class Text ...

  9. spring基于xml的IOC环境搭建和入门

    配置pom.xml的依赖 <packaging>jar</packaging> <dependencies> <dependency> <grou ...

随机推荐

  1. Spring boot之配置server信息

    知识点: 1.修改端口号 2.修改context-path 3.其它配置说明 配置端口号: Spring boot 默认端口是8080, 如果想要进行更改的话, 只需要修改applicatoin.pr ...

  2. 20175215 2018-2019-2 第一周Linux虚拟机环境调试及java程序调试学习总结

    一.Linux虚拟机的java环境调试 之前直接在终端中使用export直接配置java的运行环境,导致每次终端被重启的时候都要重新配置java的运行环境,直到看到老师的博客Intellj IDEA ...

  3. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一

    下次会为大家深入解析这个小工具.  最先看到这个工具是在EF产品组最新的博客文章上,http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power ...

  4. spark 笔记 2: Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing

    http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf  ucb关于spark的论文,对spark中核心组件RDD最原始.本质的理解, ...

  5. 可滚动UIStackView 竖向居中 / 横向右对齐

    重点: 在scroll view和stack view之间加一个UIView. 竖向居中Tutorial: https://stackoverflow.com/questions/50766400/c ...

  6. fastjson解析list ,object中含有list, object中含有map

    1.首先定义测试vo package com.haiyisoft.cAssistantWeb.ui; import java.sql.Timestamp; public class vo {priva ...

  7. java 中的多态

    多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态. 下面利用代码进行简单概述: 实现多态必须要满足三个条件 1必须有继承 2必须重写 3必须父类引用子类对象 ...

  8. vue-解决弹出蒙层滑动穿透问题

    最近开发过程中遇到一些小问题(似乎问题总是那么多),但一直没什么时间去优化与解决.程序员不能被业务绑架,有时间还是花点在代码上

  9. Emacs 浏览网页

    Emacs 浏览网页非常方便,还可以忽略掉那些烦人的小广告.特别是在看小说 的时候~ 在之前了解如何通过Emacs浏览网页时,大部分人使用的是w3m,折腾了半天,没能成功.后来无意间发现 ,有EWW ...

  10. OSPF协议学习以及路由器配置

    OSPF协议学习以及路由器配置 1.实验任务 2,使用eNsp搭建网络拓扑 3.配置路由IP ps:要使用GE(3层口),2层口(E口)需要先配置Vlan才能配置IP地址 4.配置路由器R1的ospf ...