构造方法注入

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

参数名称注入

  • School实体类
  1. package com.example.pojo03;
  2. public class School {
  3. private String name;
  4. private String address;
  5. @Override
  6. public String toString() {
  7. return "School{" +
  8. "name='" + name + '\'' +
  9. ", address='" + address + '\'' +
  10. '}';
  11. }
  12. public School(String name, String address) {
  13. this.name = name;
  14. this.address = address;
  15. System.out.println("School有参构造方法执行,实例对象被创建....");
  16. }
  17. }
  • applicationContext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- bean工厂 -->
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- 通过构造方法的参数名称,注册School实例对象 -->
  7. <bean id="school" class="com.example.pojo03.School">
  8. <constructor-arg name="name" value="nefu"/>
  9. <constructor-arg name="address" value="哈尔滨"/>
  10. </bean>
  11. </beans>
  • 测试
  1. package com.example.test;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class TestConstructor {
  6. //测试:通过构造方法的参数名称注入
  7. @Test
  8. public void testConstructorArgs(){
  9. //创建Spring容器
  10. ApplicationContext ac = new ClassPathXmlApplicationContext("source03/applicationContext.xml");
  11. //取出School对象并打印输出
  12. System.out.printf("School实例对象: " + ac.getBean("school"));
  13. }
  14. }
  • 测试结果
  1. School有参构造方法执行,实例对象被创建....
  2. School实例对象: School{name='nefu', address='哈尔滨'}
  3. Process finished with exit code 0

参数下标注入

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

默认参数顺序注入

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

注意

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

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

  1. <!-- 通过构造方法的参数下标,注册Student实例对象 -->
  2. <bean id="student" class="com.example.pojo03.Student">
  3. <constructor-arg index="0" value="荷包蛋"/>
  4. <constructor-arg index="2" ref="school"/>
  5. <constructor-arg index="1" value="20"/>
  6. </bean>
  • 但是依靠参数默认顺序注入时,要严格参考实体类中待注入属性的顺序和类型,保证与标签中的待注入值的类型相同,不然会类型解析错误,数据注入失败
  1. <!-- 通过构造方法默认参数顺序,注册Student实例对象 -->
  2. <bean id="student02" class="com.example.pojo03.Student">
  3. <constructor-arg value="荷包蛋"/>
  4. <constructor-arg ref="school"/>
  5. <constructor-arg value="20"/>
  6. </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. JAVA - 线程从创建到死亡的几种状态都有哪些?

    JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...

  2. Linux系列之linux访问windows文件

    Linux永久挂载windows共享文件 Linux系统必须安装samba-client Linux服务器必须能访问到Windows的共享文件服务的(445端口) 1.Windows共享文件 2.测试 ...

  3. Git使用 - 忽略特定文件 - gitignore

    1. 背景 2. 创建.gitignore 文件 3. 文件内容样式 4. exclude文件 5. gitignore 文件模板 6. 参考文档 1. 背景 前提知识:在工作目录下的每一个文件都不外 ...

  4. 【转载】浅谈大规模k8s集群关于events的那些坑

    原文链接:一流铲屎官二流程序员[浅谈大规模k8s集群关于events的那些坑] 背景 随着k8s集群规模的增加,集群内的object数量也与日俱增,那么events的数量也会伴随其大量增加,那么当用户 ...

  5. ES6 伪数组转真数组

    更新日志 2022年6月13日 发布. 2022年5月19日 笔记迁移到博客. 直接上代码 [...a];

  6. C++ 之多态总结

    前言 最近为了完成数据库系统的实验,又复习起了<C++ Primer>,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的,没有领会多态的奥妙,学完 Java 之 ...

  7. 一、shell编程与变量

    目录 命令是什么 命令是如何运行的: 基本语法 解释器 注释 如何执行 输入.输出流 重定向 管道符 | 变量 常见Shell变量的类型包括: 变量命名原则 单引号和双引号 反引号 变量作用范围 查看 ...

  8. Elasticsearch学习系列三(搜索案例实战)

    Query DSL Es提供了基于JSON的完整查询DSL(Domain Specific Language 特定域的语言)来定义查询.将查询DSL视为查询的AST(抽象语法树).它由两种子句组成: ...

  9. Windows-matlab简易安装-用于数字图像处理

    安装 下载链接 解压文件得到 双击setup.exe 主要注意几点 使用文件安装密匙 只需安装这三个即可 将两个文件夹里面的dll文件复制到安装目录的 /bin/win64 目录 两个 .lic 文件 ...

  10. SAP Smart Form 无法通过程序自定义默认打印机问题解决

    *&---------------------------------------------------------------------* *& Form FRM_SET_PRI ...