构造方法注入

  • 具体有3种注入方式:通过构造方法的 a.参数名称注入 b.参数下标注入 c.默认参数顺序注入

参数名称注入

  • School实体类
package com.example.pojo03;

public class School {
private String name;
private String address; @Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
} public School(String name, String address) {
this.name = name;
this.address = address;
System.out.println("School有参构造方法执行,实例对象被创建....");
}
}
  • applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>

<!-- bean工厂 -->
<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"> <!-- 通过构造方法的参数名称,注册School实例对象 -->
<bean id="school" class="com.example.pojo03.School">
<constructor-arg name="name" value="nefu"/>
<constructor-arg name="address" value="哈尔滨"/>
</bean> </beans>
  • 测试
package com.example.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestConstructor { //测试:通过构造方法的参数名称注入
@Test
public void testConstructorArgs(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("source03/applicationContext.xml");
//取出School对象并打印输出
System.out.printf("School实例对象: " + ac.getBean("school"));
}
}
  • 测试结果
School有参构造方法执行,实例对象被创建....
School实例对象: School{name='nefu', address='哈尔滨'} Process finished with exit code 0

参数下标注入

  • 实体类:新增Student实体类,持有School实例对象的引用
package com.example.pojo03;

public class Student {
private String name;
private int age;
private School school; @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
} public Student(String name, int age, School school) {
this.name = name;
this.age = age;
this.school = school;
System.out.println("Student有参构造方法执行,实例对象被创建....");
}
}
  • applicationContext.xml:新增bean标签,注册Student实例对象
    <!-- 通过构造方法的参数下标,注册Student实例对象 -->
<bean id="student" class="com.example.pojo03.Student">
<constructor-arg index="0" value="荷包蛋"/>
<constructor-arg index="1" value="20"/>
<constructor-arg index="2" ref="school"/>
</bean>
  • 测试:新增测试方法
    //测试:通过构造方法的参数下标注入
@Test
public void testConstructorIndex(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("source03/applicationContext.xml");
//取出Student对象并打印输出
System.out.printf("Student实例对象: " + ac.getBean("student"));
}
  • 测试结果
School有参构造方法执行,实例对象被创建....
Student有参构造方法执行,实例对象被创建....
Student实例对象: Student{name='荷包蛋', age=20, school=School{name='nefu', address='哈尔滨'}} Process finished with exit code 0

默认参数顺序注入

  • applicationContext.xml:新增bean标签,通过构造方法默认参数顺序注册Student实例对象,注意将之前对Student实例对象的注册先注释掉
    <!-- 通过构造方法默认参数顺序,注册Student实例对象 -->
<bean id="student02" class="com.example.pojo03.Student">
<constructor-arg value="荷包蛋"/>
<constructor-arg value="20"/>
<constructor-arg ref="school"/>
</bean>
  • 测试:新增测试方法
    //测试:通过构造方法默认参数顺序注入
@Test
public void testConstructorDefaultOrder(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("source03/applicationContext.xml");
//取出Student对象并打印输出
System.out.printf("Student实例对象: " + ac.getBean("student02"));
}
  • 测试结果
School有参构造方法执行,实例对象被创建....
Student有参构造方法执行,实例对象被创建....
Student实例对象: Student{name='荷包蛋', age=20, school=School{name='nefu', address='哈尔滨'}} Process finished with exit code 0

注意

前两种注入方式,由于一种依靠参数名和待注入值绑定,一种依靠参数下标和待注入值绑定,做到了注入值与待注入目标一一对应

所以注入标签顺序随意,调换 < constructor-arg />标签的前后顺序,仍可正确注入数据

    <!-- 通过构造方法的参数下标,注册Student实例对象 -->
<bean id="student" class="com.example.pojo03.Student">
<constructor-arg index="0" value="荷包蛋"/>
<constructor-arg index="2" ref="school"/>
<constructor-arg index="1" value="20"/>
</bean>
  • 但是依靠参数默认顺序注入时,要严格参考实体类中待注入属性的顺序和类型,保证与标签中的待注入值的类型相同,不然会类型解析错误,数据注入失败
    <!-- 通过构造方法默认参数顺序,注册Student实例对象 -->
<bean id="student02" class="com.example.pojo03.Student">
<constructor-arg value="荷包蛋"/>
<constructor-arg ref="school"/>
<constructor-arg value="20"/>
</bean>
  • 容器启动时,School实例对象成功创建并注入数据,但创建Student对象时,待注入数据类型和目标属性类型不对应,类型解析错误,创建失败

Spring 03: 基于xml的构造方法注入的更多相关文章

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

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

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

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

  3. spring的基于xml的AOP配置案例和切入点表达式的一些写法

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  4. Spring中基于xml的AOP

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点 ...

  5. spring的基于XML方式的属性注入

    1.掌握spring的属性注入的方法: 1.1构造方法注入普通值---------<constructor-arg>标签的使用 首先新建一个类 package spring.day1.de ...

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

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

  7. Spring:基于注解的依赖注入的使用

    1.什么是pojo?什么是bean? 首先,在之前几篇Spring的介绍文章当中,自己都提到了一个名词叫做POJO类,但是在回顾Spring的注解的使用的时候,去形容java当中的对象还有一个名词是叫 ...

  8. spring-第十八篇之spring AOP基于XML配置文件的管理方式

    1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...

  9. Spring学习--基于 XML 的配置声明切面

    正常情况下 , 基于注解的生命要优先于基于 XML 的声明. 通过 AspectJ 注解 , 切面可以与 AspectJ 兼容 , 而基于 XML 的配置则是 Spring 专有的.由于 Aspect ...

随机推荐

  1. POJ1821 Fence 题解报告

    传送门 1 题目描述 A team of $k (1 <= K <= 100) $workers should paint a fence which contains \(N (1 &l ...

  2. 深入C++03:面向对象

    面向对象 类和对象.this指针 不用做太多笔记,都可以看初识C++的笔记: 记住:声明后面都要加":",比如声明方法和变量还有class结束的地方:而实现函数出来的地方是不需要加 ...

  3. 【Java并发编程】Synchronized关键字实现原理

    想必在面试中经常会被问到Synchronized关键字,它有什么特性,原理什么 它的主要特性是同步锁.非公平锁.阻塞锁.可以保证线程安全(可见性.原子性.有序性) JDK1.6之后对Synchroni ...

  4. Lifted ElGamal 门限加密算法

    本文详细学习Lifted ElGamal 门限加密算法 门限加密体制 (1)门限加密是可以抗合谋的 (2)表现在私钥分为\(n\)份,至少需要\(t\)份才能解密成功,叫做(t-n)门限.类似于&qu ...

  5. LVS+keepalived高可用

    1.keeplived相关 1.1工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题. 在一个LVS服务集群中通常有主服务器(MAS ...

  6. php 正则获取字符串中的汉字(去除字符串中除汉字外的所有字符)

    preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $list[$i]['iparr'], $matches); $list[$i]['iparr'] = join(' ...

  7. salt stack安装与使用

    SaltStack除了传统的C/S架构外,其实还有Masterless架构,如果采用Masterless架构,我不需要单独安装一台SaltStack Master机器,只需要在每台机器上安装Minio ...

  8. 简单性能测试:springboot-2.x vs actix-web-4.x benchmark

    性能测试:springboot-2.x vs actix-web-4.x benchmark 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/15956465.h ...

  9. git的工作原理和git项目创建及克隆

    Git基本理论(重要)三个区域Git本地有三个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或Git Directory).如 ...

  10. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...