Spring_Spring与IoC_基于XML的DI
一、注入分类
bean实例在调用无参构造器创建空值对象后,就要对Bean对象的属性进行初始化。初始化时由容器自动完成的,称为注入。根据注入方式的不同,常用的有2类:设值注入、构造注入。(还有一种,实现特定接口注入,采用侵入式编程,污染了代码,几乎不用)。
二、设值注入
public class Student {
private String name;
private int age;
private School school;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
}
}
Student
public class School {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School [name=" + name + "]";
}
}
School
public class MyTest {
@Test
public void test01() {
//创建容器对象
String resource = "com/jmu/di01/applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(resource);
Student student = (Student) ac.getBean("myStudent");
System.out.println(student);
}
}
MyTest
<bean id="mySchool" class="com.jmu.di01.School">
<property name="name" value="清华大学"></property>
</bean>
<bean id="myStudent" class="com.jmu.di01.Student">
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="school" ref="mySchool"></property>
</bean>
applicationContext.xml
三、构造注入
public class Student {
private String name;
private int age;
private School school;
public Student() {
super();
}
public Student(String name, int age, School school) {
super();
this.name = name;
this.age = age;
this.school = school;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
}
}
Student
public class School {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School [name=" + name + "]";
}
}
School
<bean id="mySchool" class="com.jmu.di02.School">
<property name="name" value="清华大学"></property>
</bean>
<bean id="myStudent" class="com.jmu.di02.Student">
<constructor-arg name="name" value="李四"/>
<constructor-arg name="age" value="24"/>
<constructor-arg name="school" ref="mySchool"/>
</bean>
applicationContext.xml
四、P命名空间设值注入

五、C命名空间构造注入

六、数组、集合属性注入
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class Some {
private School[] schools;
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String, Object> myMap;
private Properties myPros;//key、value均为字符串
public void setSchools(School[] schools) {
this.schools = schools;
}
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, Object> myMap) {
this.myMap = myMap;
}
public void setMyPros(Properties myPros) {
this.myPros = myPros;
}
@Override
public String toString() {
return "Some [schools=" + Arrays.toString(schools) + ", myStrs=" + Arrays.toString(myStrs) + ", myList="
+ myList + ", mySet=" + mySet + ", myMap=" + myMap + ", myPros=" + myPros + "]";
} }
Some
public class School {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School [name=" + name + "]";
}
}
School
<bean id="mySchool" class="com.jmu.di03.School">
<property name="name" value="清华大学"></property>
</bean>
<bean id="mySchool2" class="com.jmu.di03.School">
<property name="name" value="北京大学"></property>
</bean>
<bean id="mySome" class="com.jmu.di03.Some">
<property name="schools">
<array>
<ref bean="mySchool"/>
<ref bean="mySchool2"/> </array>
</property> <property name="myStrs">
<array>
<value>中国</value>
<value>福建</value>
</array>
</property> <property name="myList">
<list>
<value>厦门</value>
<value>泉州</value>
</list>
</property> <property name="mySet">
<set>
<value>唐朝</value>
<value>宋朝</value>
</set>
</property> <property name="myMap">
<map>
<entry key="mobile" value="2132124"></entry>
<entry key="QQ" value="12424532"></entry>
</map>
</property> <property name="myPros">
<props>
<prop key="education">大学</prop>
<prop key="gender">男</prop>
</props>
</property>
</bean>
applicationContext.xml
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { @Test
public void test01() {
//创建容器对象
String resource = "com/jmu/di03/applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(resource);
Some some=(Some) ac.getBean("mySome");
System.out.println(some);
} }
MyTest
输出:
Some [schools=[School [name=清华大学], School [name=北京大学]], myStrs=[中国, 福建], myList=[厦门, 泉州], mySet=[唐朝, 宋朝], myMap={mobile=2132124, QQ=12424532}, myPros={gender=男, education=大学}]
output
简写:
<property name="myStrs" value="中国,福建" />
<property name="myList" value="厦门,泉州" />
<property name="mySet" value="唐朝,宋朝" />
applicationContext.xml
七、对于域属性的自动注入
1、autowire="byName"会从容器中查找与实体类的域属性同名的Bean的id,并将该Bean对象自动注入给该域属性

2、autowire="byType"会从容器中查找与实体类的域属性类型具有is-a关系的Bean,并将该Bean对象自动注入给该域属性
<!-- <bean id="mySchool" class="com.jmu.di06.School">
<property name="name" value="集美大学"></property>
</bean> -->
<bean id="myPrimarySchool" class="com.jmu.di06.PrimarySchool">
<property name="address" value="集美区"></property>
</bean>
<bean id="myStudent" class="com.jmu.di06.Student" autowire="byType">
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
</bean>
applicationContext.xml
public class PrimarySchool extends School {
private String address;
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "PrimarySchool [address=" + address + "]";
}
}
PrimarySchool
输出:
Student [name=张三, age=20, school=PrimarySchool [address=集美区]]
output
八、使用SPEL注入
SPEL,Spring Expression Language,即Spring EL表达式语言。在Spring配置文件中为Bean的属性注入时,可直接使用SPEL表达式计算的结果。
<bean id="myPerson" class="com.jmu.di07.Person">
<property name="pname" value="宫本武藏"></property>
<property name="page" value="#{T(java.lang.Math).random()*50}"></property>
</bean>
<bean id="myStudent" class="com.jmu.di07.Student" autowire="byType">
<property name="name" value="#{myPerson.pname}"></property>
<property name="age" value="#{myPerson.page>25?25:myPerson.page}"></property>
</bean>
applicationContext.xml
Person person=(Person) ac.getBean("myPerson");
System.out.println(person);
Student student = (Student) ac.getBean("myStudent");
System.out.println(student);
MyTest
输出:
Person [pname=宫本武藏, page=15]
Student [name=宫本武藏, age=15]
output

九、内部Bean

十、同类抽象Bean

十一、异步抽象Bean

十二、为应用指定多个Spring配置文件
1、平等关系
方式一:




方式二:

二、包含关系

Spring_Spring与IoC_基于XML的DI的更多相关文章
- Spring_Spring与IoC_基于注解的DI
一.基本注解的使用 (1)导入AOP的Jar包 (2) 与set()无关 二.组件扫描器的base-package 三.@Component相关注解 四.@Scope 五.域属性的注入 (1)byTy ...
- Spring框架第三篇之基于XML的DI注入
一.注入分类 Bean实例在调用无参构造器创建空值对象后,就要对Bean对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入.构造注入.实现特定接口注入 ...
- 基于XML的DI
三.集合属性注入(包含:为数组注入值.为List注入值.为Set注入值.为Map注入值.为Properties注入值) 集合类定义如下: xml定义如下:仔细看 下面是执行代码: 四.对于 ...
- Spring_Spring与AOP_AspectJ基于XML的实现
一.前置通知 import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.as ...
- Spring4笔记4--基于XML的DI(依赖注入)
基于XML的DI(依赖注入): Bean 实例在调用无参构造器创建了空值对象后,就要对 Bean 对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入. ...
- spring3——IOC之基于XML的依赖注入(DI )
我们知道spring容器的作用是负责对象的创建和对象间关系的维护,在上一篇博客中我们讲到spring容器会先调用对象的无参构造方法创建一个空值对象,那么接下来容器就会对对象的属性进行初始化,这个初始化 ...
- SSM-Spring-07:Spring基于注解的di注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- Spring-注入方式(基于xml方式)
1.基于xml方式创建对象 <!--配置User类对象的创建 --> <bean id="user" class="com.at.spring5.Use ...
随机推荐
- 并发编程---线程 ;python中各种锁
一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...
- php面向对象编程_2
1, 抽象类 ,用abstract关键字来修饰一个类,这个类就是抽象类:如果用abstract关键字来修饰一个方法,这个方法就是抽象方法,如果是抽象方法就不能实现(即抽象方法只能声明,不能定义). 抽 ...
- [Java] 编写第一个java程序
1)先不用myEclipse编写,用txt编写,新建Test.txt:修改扩展名变为Test.java; 2)编辑,手写输入代码,保存(以保存在E盘下为例): public class Test{ p ...
- [Swift实际操作]八、实用进阶-(4)通过protocol在两个对象中进行消息传递
本文将演示如何借助协议,实现视图控制器对象和其内部的自定义视图对象之间的数据传递. 首先创建一个自定义视图对象.在项目名称文件夹点击鼠标右键New File ->Cocoa Touch Clas ...
- 10分钟教你用Python实现微信自动回复
01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...
- P3952 时间复杂度
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...
- 北航软院2013级C#期末考试部分考题解答
博主注:本渣渣水平有限,文中若有不对的地方敬请指出,谢谢. 本文中大部分图片来自老师的PPT,感谢邵老师,想要的可以点击右边QQ联系我:) 一.选择题 2.Wrong statement? A.dou ...
- 前端之JS的线程(最易懂)
1. 前言 很多文章在介绍线程以及线程之间的关系,都存在着脱节的现象.还有的文章过于广大,涉及到了内核,本文希望以通俗易懂的话去描述晦涩的词语,可能会和实际有一丢丢的出入,但是更易理解. 我们都知道J ...
- 搭建maven环境——nexus
第一步:部署maven环境和jdk环境 jdk直接用openjdk1. :yum -y install java--openjdk maven环境 wget http://mirror.rise.ph ...
- nginx windows 安装为服务.
安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...