一、注入分类

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的更多相关文章

  1. Spring_Spring与IoC_基于注解的DI

    一.基本注解的使用 (1)导入AOP的Jar包 (2) 与set()无关 二.组件扫描器的base-package 三.@Component相关注解 四.@Scope 五.域属性的注入 (1)byTy ...

  2. Spring框架第三篇之基于XML的DI注入

    一.注入分类 Bean实例在调用无参构造器创建空值对象后,就要对Bean对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入.构造注入.实现特定接口注入 ...

  3. 基于XML的DI

    三.集合属性注入(包含:为数组注入值.为List注入值.为Set注入值.为Map注入值.为Properties注入值) 集合类定义如下:   xml定义如下:仔细看 下面是执行代码:     四.对于 ...

  4. Spring_Spring与AOP_AspectJ基于XML的实现

    一.前置通知 import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.as ...

  5. Spring4笔记4--基于XML的DI(依赖注入)

    基于XML的DI(依赖注入): Bean 实例在调用无参构造器创建了空值对象后,就要对 Bean 对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入. ...

  6. spring3——IOC之基于XML的依赖注入(DI )

    我们知道spring容器的作用是负责对象的创建和对象间关系的维护,在上一篇博客中我们讲到spring容器会先调用对象的无参构造方法创建一个空值对象,那么接下来容器就会对对象的属性进行初始化,这个初始化 ...

  7. SSM-Spring-07:Spring基于注解的di注入

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...

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

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

  9. Spring-注入方式(基于xml方式)

    1.基于xml方式创建对象 <!--配置User类对象的创建 --> <bean id="user" class="com.at.spring5.Use ...

随机推荐

  1. 20 行代码极速为 App 加上聊天功能

    现在很多 App 都需要集成 IM 功能,今天就为大家分享一下集成 IM 基本功能的步骤.本文内容以 JMessage 为例.极光 IM ( JMessage ) = 极光推送 ( JPush ) + ...

  2. Beginning and Ending the Speech

    Beginning and Ending the Speech Just as musical plays need appropriate beginnings and endings, so do ...

  3. python高级(六)——用一等函数实现设计模式

    本文主要内容 经典的“策略”模式 python高级——目录 文中代码均放在github上:https://github.com/ampeeg/cnblogs/tree/master/python高级 ...

  4. node爬取页面元素

    /** * Created by on 2018/12/25. */const http = require("https");const fs = require('fs'); ...

  5. CAS总结

    n++的问题不能保证原子操作. 因为被编译后拆分成了3个指令,先获取值,然后加一,然后写回内存.把变量声明为volatile,volatile只能保证内存可见性,但是不能保证原子性,在多线程并发下,无 ...

  6. vue-tree 组织架构图/树形图自动生成(含添加、删除、修改)

    项目中用代码生成组织架构图  有新增,编辑,删除的功能            生成树形图的组件git-hub地址: https://github.com/tower1229/Vue-Tree-Char ...

  7. hive Data Types

    在文章最开始,就先强调一下,hive不是仅仅支持string类型,hive不是仅仅支持string类型,hive不是仅仅支持string类型. Numeric Types tinyint,-128到1 ...

  8. Image和Base64相互转换

    1.图片转换为Base64 /// <summary> /// 图片转换为base64 /// </summary> /// <param name="imag ...

  9. HttpClient登陆后获取并携带cookies发起请求

    最近项目中,用到了登陆后获取并携带cookies发起请求的业务场景,现总结写出来备忘一下. 1.定义存取cookies信息的全局变量 public class HttpUtil { /** * 用来存 ...

  10. 查看SqlServer某张表的物理空间占用情况

    以下语句可以查看表的物理空间使用情况 包括 [ROWS] 内容的行数.. [reserved] 保留的磁盘大小.. [data] 数据占用的磁盘大小.. [index_size] 索引占用的磁盘大小. ...