一、注入分类

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. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  2. POJ3349 Snowflake Snow Snowflakes (JAVA)

    首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...

  3. Navicat设定mysql定时任务

    有个需求:每天将一张表的前一天的数据抽取到另一张表中,使用Mysql数据库的客户端Navicat配置 第一步,创建过程cust_report,直接在查询窗口中执行,保存后函数列表中就会出现. 第二步, ...

  4. tomcat在bin下的startup.bat下启动报错

    测试环境是否安装配置好. 如果环境配置好.报错如下:或者是730013 -----------解决问题:是因为tomcat端口被占用.查看是否启动两个tomcat

  5. Shiro入门指引

    最近项目中用到Shiro,专门对其研究了一番,颇有收获,以下是笔者最近写的博客,希望对大家入门有所帮助. Shiro入门资源整理 Shiro在SpringBoot中的使用 Shiro源码解析-登录篇 ...

  6. Versions maven plugin 修改版本

    使用versions maven plugin插件,批量修改项目各模块的版本号,灵活推进或回退版本,避免主干每次更新代码,立即对所有分支产生影响. https://blog.csdn.net/sunz ...

  7. PIE_SDK.NET功能表

  8. 关于:Mac下IDEA更换Maven仓库

    一.MAC安装配置maven环境变量 1.下载maven包: 下载链接:

  9. Java生成树关系的菜单

    1.菜单bean public class Menu { private String id; private String menuname; private String parentid; pr ...

  10. npm 包管理工具

    能注册后看简单的功能 订单加信息 下单之前的判断要配合海潮的迁移数据 运行自定义的脚本 在 package.json 的 scripts 里添加自定义的结点 ( 比如 CSOR-serve ) &qu ...