Spring(五):IoC创建对象的方式

一、bean被创建的时间

考虑一个问题,我们都知道spring通过xml的配置创建bean,那么bean是什么时间被创建的呢?是在我们getBean()的时候创建的吗?

我们来做一个测试:

1.首先建立一个User类:

package com.jms.pojo;

public class User {
    private String name;

    public User() {
        System.out.println("User被创建了");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

我们在User的无参构造中加入了一个打印语句,当User被创建时就会打印出”User被创建了”。

2.然后对应的一个xml配置文件:

xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.jms.pojo.User">
        <property name="name" value="jms"/>
    bean>

beans>

3.一个测试

@Test
    public void userTest() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    }

这个测试只有创建容器这一行代码。

测试结果:

Spring(五):IoC创建对象的方式

由上可以看出,即使我们没有使用bean,bean也在创建容器的时候就被创建并且存放在了容器之中;还可以看出,创建bean的方式默认是调用无参构造。

二、IoC创建对象的方式

1.默认:通过无参构造进行创建

2.通过有参构造创建

虽然默认是通过无参构造进行创建,我们能不能通过有参构造进行创建呢?答案是可以的。

我们还是先来做个测试,用一个有参构造覆盖无参构造:

package com.jms.pojo;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

此时xml文件会报错:

Spring(五):IoC创建对象的方式

那么如何在xml中配置有参构造呢?

官方给出了三种方法:

(1)通过类型进行配置

   <bean id="user" class="com.jms.pojo.User">
        <constructor-arg type="java.lang.String" value="jms"/>
    bean>

这种配置方法并不适用于有相同类型的情况,所以不建议用。

(2)通过索引进行配置

    <bean id="user" class="com.jms.pojo.User">
        <constructor-arg index="0" value="jms"/>
    bean>

索引从0开始依次递增,由于我这里只有一个参数,所以只有一个0.

(3)通过参数名进行配置

   <bean id="user" class="com.jms.pojo.User">
        <constructor-arg name="name" value="jms"/>
    bean>

这种方法应该是最简单明了的。

还有一种特殊情况就是传入的参数也是一个bean,这种情况官方同样给出了解决的方案:

package x.y;

public class ThingOne {

    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...

    }
}
<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
beans>

(本文仅作个人学习记录用,如有纰漏敬请指正)

Original: https://www.cnblogs.com/jmsstudy/p/16707604.html
Author: 谁知道水烫不烫
Title: Spring(五):IoC创建对象的方式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616434/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在二叉树中找到累加和为指定值的最长路径(前缀和)

    给定一颗二叉树和一个整数 sum,求累加和为 sum 的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 求和为指定值的最长路径,我们可以把每一…

    Java 2023年6月7日
    0105
  • Java8日期常用方法

    java;gutter:true; import junit.framework.TestCase;</p> <p>import java.time.*; …

    Java 2023年5月29日
    064
  • SpringBoot中Tomcat和SpringMVC整合源码分析

    概述 ​ SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的。添加相关的Maven依赖之后,会引入具体的jar包,在Sp…

    Java 2023年6月13日
    0104
  • 页面国际化

    页面国际化 有的时候,我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要对页面进行国际化设计了。 6.1 准备工作 在IDEA中统一设置properties的编码格式 6….

    Java 2023年6月5日
    062
  • Spring Boot 集成 Thymeleaf

    使用 idea 新建一个 demo 项目 pom.xml 在 templates 文件夹中 新增一个 index.html controller 层 启动后,进行访问得到的效果 访…

    Java 2023年5月30日
    089
  • 简述Java多线程(二)

    Java多线程(二) 线程优先级 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。 优先级高的不一定先执行,大多…

    Java 2023年6月7日
    0110
  • 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(三)-项目初始化

    项目开发前,请确保已安装好以下开发环境: MySQL 8.0 Redis 7.0 Elasticsearch 8.2.0(选装) RabbitMQ 3.10.2(选装) JDK 1…

    Java 2023年6月8日
    074
  • devops学习

    DevOps对应用程序发布的影响 在很多企业中,应用程序发布是一项涉及多个团队、压力很大、风险很高的活动。然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下 [2…

    Java 2023年5月29日
    067
  • JDK8下载安装及环境配置

    Java基础知识 Java的三种版本 JavaSE :标准版,主要用于开发桌面程序,控制台开发等等 JavaME:嵌入式开发,主要用于开发手机,小家电等等,目前使用的比较少 Jav…

    Java 2023年6月7日
    078
  • 地图坐标:地图火星坐标、地球坐标、百度坐标偏差转换(java代码)

    简单说明什么是坐标偏移? http://yanue.net/post-121.html 地球坐标 (WGS84) 国际标准,从 GPS 设备中取出的数据的坐标系 *国际地图提供商使…

    Java 2023年5月29日
    083
  • java- 接口笔记

    接口 interface 接口就是一组规范(就像我们法律一样),所有实现类都要遵守。 面向对象的精髓,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(…

    Java 2023年6月15日
    0106
  • nginx入门教程

    nginx入门教程 一.概述 什么是nginx? Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 什么…

    Java 2023年5月30日
    097
  • C# 线程手册 第三章 使用线程 系列

    在之前章节,我们已经讨论过线程在开发多用户应用程序时扮演的重要角色。我们已经使用线程来解决一些重要的问题,比如让多个用户或者客户端在同一时间访问同一个资源。然而,在学习过程中我们忽…

    Java 2023年5月29日
    072
  • 3.门面Slf4j+logback

    1.导入pomyil org.slf4j slf4j-api 1.7.27 ch.qos.logback logback-classic 1.2.3 2.默认使用logback.x…

    Java 2023年6月13日
    084
  • HashTable HashMap concurrentHashMap区别

    HashTable HashMap concurrentHashMap区别 HashMap、HashTable、ConcurrentHashMap都是map接口的实现类 1.(同步…

    Java 2023年6月13日
    056
  • MySQL采用B+树作为索引的原因

    MySQL采用B+树作为索引的原因 1、MySQL的索引结构是如何查询的 在MySQL中,存储的数据记录都是持久化到磁盘中的,数据包含索引和记录,当MySQL查询数据时,由于索引也…

    Java 2023年6月8日
    0126
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球