03-Spring基于xml的IOC配置--spring的依赖注入
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的依赖注入的更多相关文章
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- 01Spring基于xml的IOC配置--入门
01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...
- Spring专题2: DI,IOC 控制反转和依赖注入
合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
创建新项目 修改为jar包的方式 把上一个工程内的代码 java下的com复制过来 由于配置文件没有,所以一运行就会报错 factory文件夹整个删除 dao的实现类 这里删除 测试类保留这两行代码 ...
- Spring基于XML的IOC环境搭建及入门
一.使用Maven构建Java项目 * 项目目录结构 1. 在sun.service包下创建UserDao接口和接口实现类: UserDao接口: package sun.service; /** * ...
- Spring 基于注解的 IOC 配置
创建 spring 的 的 xml 配置 文件 <context:component-scan base-package="com.itheim"/> 指定创建容器时要 ...
- Spring基于XML的IoC
Maven导入Spring依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...
- Spring基于构造函数和设值函数的依赖注入
基于构造函数的依赖注入 我们知道,bean标签中指定的类会进行初始化,这个初始化过程中自然会调用构造函数,那我们也可以利用这个构造函数完成依赖注入. 先创建一个类: public class Text ...
- spring基于xml的IOC环境搭建和入门
配置pom.xml的依赖 <packaging>jar</packaging> <dependencies> <dependency> <grou ...
随机推荐
- 用node.js搭建一个静态资源站 html,js,css正确加载 跳转也完美实现!
昨天买了一个服务器想着用来测试一些自己的项目,由于是第一次建站,在tomcat,linux,node.js间想了好久.最终因为node搭建比较方便没那么麻烦就决定用node.js来搭建网站项目. 搭建 ...
- CodeForge源码分享
<a target=_blank href=http://www.codeforge.cn/point/?recoid=2215596>CodeForge源码分享</a>
- CentOS 6.4编译安装和部署Zabbix 2.0版本监控(中文)
[一].zabbix简介 zabbix是一个基于web界面的提供分布式系统监视以及网络监视功能的企业级开元解决方案 zabbix由2部分构成,zabbix_server和可选组件zabbix_agen ...
- 全面解读php-php会话控制技术
一.PHP会话控制技术 1.为什么要使用会话控制技术? 因为http协议是无状态协议,所以同一个用户在请求同一个页面两次的时候,http协议不会认为这两次请求都来自于同一个用户,会把它们当做是两次请求 ...
- 40组合总和II
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一 ...
- ALV SCRIPTFROM 内容比较全的一个例子
REPORT ZQM_PRT04. *----------------------------------------------------------------------* * TABLES ...
- java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)
1.级联删除: -- 级联删除:裁员,公司倒闭 -- 级联删除(cascade),设置为null(setnull),放任不管(No action) -- cascade:(以一对多为例)如果删除多的一 ...
- 修改Windows 2008以后系统的NTP服务设置
@echo off echo autor OAK @echo off echo -------------------------------- @echo off echo setup time r ...
- neutron网络服务
一.neutron 介绍: 1. Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需 ...
- 【LeetCode】122、买卖股票的最佳时机 II
Best Time to Buy and Sell Stock II 题目等级:Easy 题目描述: Say you have an array for which the ith element i ...