构造方法注入

  • 具体有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. 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...

  2. 关于python导入数据库excel数据时出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, severity 1的问题总结

    1.对于在使用python导入sqlsever时,出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, se ...

  3. 设置C#启动进程但不显示命令行窗口

    设置一下Process类型相关的配置属性即可,直接上代码. //记得引入命名空间 //using System.Diagnostics; //获得当前环境的基路径 string basePath = ...

  4. C#.NET中的程序集版本

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年8月22日. 在Visual Studio中查看程序集版本 在程序运行中获得程序集版本信息 除了在Visual ...

  5. vue 使用npm install安装依赖失败 【问题分析与解决】

    1 进入项目根目录,先通过 npm install 命令安装项目所需依赖,再通过 vue ui 命令打开 Vue Cli 提供的图形化界面,选择项目所在文件夹将项目导入. 出现问题 npm insta ...

  6. C语言学习之我见-malloc和free内存申请及释放函数

    malloc函数负责向计算机申请确定大小的内存空间. free函数负责释放malloc的申请空间. (1)函数原型 void free(void *_Memory); void * malloc(si ...

  7. pytorch初学

    (pytorch_gpu) D:\pytorch-text>pythonPython 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 ...

  8. MySQL-3-DML

    DML 数据操作语言 插入insert 语法一:insert into 表名(列名,...)values(值1,...): 语法二:insert into 表名 set 列名=值,列名=值,... 插 ...

  9. SAP SD-Invoice 销售发票

    针对销售订单的发票流程: 1. 事务码:VF01(个别生成系统发票) 创建开票凭证(发票)/  VF04 开具系统发票(可把多个item 合并成一张系统发票) 2. 事务码:VF02 修改发票, 释放 ...

  10. 一文掌握GitHub Actions基本概念与配置

    CI/CD包含很多流程,如拉取代码.测试.构建打包.登录远程服务器.部署发布等等. 而Github Actions是GitHub推出的一个CI/CD工具,类似工具还有TravisCI.Jenkins等 ...