Spring5中IOC创建对象的方式(有参与无参)与时机(附三类无参创建代码供参考)

news2024/11/25 5:53:00

Spring5中IOC创建对象的方式(有参与无参)附三类无参创建代码供参考

1. IOC容器

IOC是Spring框架的核心内容,Spring容器使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。

2. IOC容器创建对象过程

(1) 先通过createBeanFactory创建出一个bean工厂(利用顶级接口BeanFactory下的DefaultListableBeanFactory接口)。
(2) 循环创建对象,由于容器中bean默认都是单例,则优先通过getBean,doGetBean从容器中查找。
(3) 如果找不到则通过createBean,doCreateBean方法,以反射形式创建对象。一般情况下使用的是无参构造方法(getDeclaredConstructor,newInscance)。
(4) 进行对象的属性填充(populateBean)。
(5) 进行其它初始化操作(initializingBean)。

3. 无参构造

pojo下的User实体类创建

image-20240616101946723

package com.lanyy.pojo;

public class User {
    private String name;
    // 无参构造
//    public User(){
//        System.out.println("User的无参构造");
//    }

    // 有参构造
    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("name:" + name);
    }
}

beans.xml配置文件参考

Spring的配置文件beans.xml中有一个属性lazy-init=“default/true/false”
(1)如果lazy-init为"default/false"在启动spring容器时创建对象
(2)如果lazy-init为"true",在context.getBean时才要创建对象

image-20240616101507905

<?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="userDaoImpl" class="com.lanyy.dao.UserDaoImpl"/>
    <bean id="mysqlImpl" class="com.lanyy.dao.UserDaoMysqlImpl"/>
    <bean id="oracleImpl" class="com.lanyy.dao.UserDaoOracleImpl"/>

    <!--
      beans.xml 本质是一个Spring容器
      ref : 引用Spring容器中创建好的对象
      value : 具体的值,基本数据类型!
    -->

    <bean id="userServiceImpl" class="com.lanyy.service.UserServiceImpl">
            <property name="userDao" ref="userDaoImpl"/>
    </bean>
        <!-- pojo实体类配置引入 -->
    <!--  无参构造  -->
    <bean id="user" class="com.lanyy.pojo.User">
        <property name="name" value="lanyy"/>
    </bean>
</beans>

4. 有参构造

<?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="userDaoImpl" class="com.lanyy.dao.UserDaoImpl"/>
    <bean id="mysqlImpl" class="com.lanyy.dao.UserDaoMysqlImpl"/>
    <bean id="oracleImpl" class="com.lanyy.dao.UserDaoOracleImpl"/>

    <!--
      beans.xml 本质是一个Spring容器
      ref : 引用Spring容器中创建好的对象
      value : 具体的值,基本数据类型!
    -->

    <bean id="userServiceImpl" class="com.lanyy.service.UserServiceImpl">
            <property name="userDao" ref="userDaoImpl"/>
    </bean>

<!--  IOC有参构造创建对象的三种方式  -->

    <!--  有参构造  -->
    <!--  第一种:下标赋值  -->
<!--    <bean id="user" class="com.lanyy.pojo.User">-->
<!--        <constructor-arg index="0" value="懒羊羊滚雪球"/>-->
<!--    </bean>-->

    <!--  第二种:参数类型匹配  单参数String可用 多参不可用 -->
<!--    <bean id="user" class="com.lanyy.pojo.User">-->
<!--        <constructor-arg type="java.lang.String" value="懒羊羊滚雪球"/>-->
<!--    </bean>-->
<!--  第三种:参数名匹配(直接通过参数名来设置)  -->
    <bean id="user" class="com.lanyy.pojo.User">
        <constructor-arg name="name" value="懒羊羊滚雪球"/>
    </bean>
</beans>

5. Test类编写

import com.lanyy.dao.UserDaoHiveImpl;
import com.lanyy.dao.UserDaoMysqlImpl;
import com.lanyy.pojo.User;
import com.lanyy.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
//        // 用户实际调用的是业务层,dao层不需要接触
//        UserServiceImpl userService = new UserServiceImpl();
//        // 用户通过业务层去调用dao层
        userService.setUserDao(new UserDaoMysqlImpl());
//        userService.setUserDao(new UserDaoHiveImpl());
//        userService.getUser();

        // 容器练习
//        // 获取ApplicationContext对象,拿到配置文件(Spring容器)
//        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        // 容器在手 天下我有 需要什么 get什么   name 名字 用户可以自定义,此处userServiceImpl
//        UserServiceImpl userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class);
//        userServiceImpl.getUser();

        // pojo实体类练习
        // 走无参构造方法
//        User user = new User();
// 有参通用写法:由Object强转成我需要的对象User        
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        // 由Object强转成我需要的对象User
        User user = context.getBean("user", User.class);
        user.show();
    }
}

总结:在配置文件加载时,容器中管理的对象就已经被初始化

了解更多知识请戳下:

@Author:懒羊羊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式微处理器重点学习(三)

堆栈操作 R1=0x005 R3=0x004 SP=0x80014 STMFD sp!, {r1, r3} 指令STMFD sp!, {r1, r3}是一条ARM架构中的存储多个寄存器到内存的指令,这里用于将r1和r3寄存器的内容存储到栈上。STMFD(Store Multiple Full Descending)是一种全递减模式的多寄存器存储指令,它会先将栈指针…

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输&#xff0c;以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍&#xff1a;基于 HTTP…

MySQL-创建表~数据类型

070-创建表 create table t_user(no int,name varchar(20),gender char(1) default 男);071-插入数据 语法格式&#xff1a; insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…

嵌入式门槛高不高,工资怎么样?

一般来说&#xff0c;嵌入式岗位的准入门槛其实并不是特别高。通常情况下&#xff0c;只要能够熟练掌握 C 语言编程以及单片机相关知识&#xff0c;就能够去制作一些较为简单的电子产品&#xff0c;由此可见其门槛相对而言是比较低的&#xff0c;相应的薪水可能也不会特别高。 …

【Kafka】Kafka提高生产者吞吐量、数据可靠性-06

【Kafka】Kafka提高生产者吞吐量-06 1. 提高生产者吞吐量2.数据可靠性2.1 回顾数据的发送流程2.2 ack应答级别2.2.1 acks:02.2.2 acks:12.2.2 acks:-1(all)2.2.2.1 数据可靠性分析2.2.2.2 数据完全可靠 2.3 可靠性总结2.4 可靠性代码配置 1. 提高生产者吞吐量 import org.apach…

[C++] vector list 等容器的迭代器失效问题

标题&#xff1a;[C] 容器的迭代器失效问题 水墨不写bug 正文开始&#xff1a; 什么是迭代器&#xff1f; 迭代器是STL提供的六大组件之一&#xff0c;它允许我们访问容器&#xff08;如vector、list、set等&#xff09;中的元素&#xff0c;同时提供一个遍历容器的方法。然而…

Vue26-内置指令03:v-cloak指令

一、需求 将引入本地JS的代码&#xff0c;换成引入外部JS&#xff0c;且引入的外部JS要等待5S。 【备注】&#xff1a;浏览器也能调节网速 二、js阻塞 <body>的最下方也能引入JS&#xff1a; 此时&#xff0c;用户能在5S内看到root容器未编译的部分。 解决该问题&#x…

工程设计问题---滚动轴承问题

参考文献&#xff1a; [1]李煜,梁晓,刘景森,等.基于改进平衡优化器算法求解工程优化问题[J/OL].计算机集成制造系统,1-34[2024-06-16].

高级人工智能复习 题目整理 中科大

题目整理 填空 1.准确性&#xff0c;复杂性&#xff0c;验证集 2. 3 2 n 3^{2^n} 32n 3 C 2 n m 3^{C^m_{2n}} 3C2nm​ 3 m 3^m 3m n 1 n1 n1 3. 状态 从状态s采取行动a后继续采用策略 π \pi π的收益 环境 4. 语法 语义 推理规则 5. 参与者&#xff0c;策略集&#xff…

FreeRTOS简单内核实现5 阻塞延时

文章目录 0、思考与回答0.1、思考一0.2、思考二0.3、思考三 1、创建空闲任务2、实现阻塞延时3、修改任务调度策略4、提供延时时基4.1、SysTick4.2、xPortSysTickHandler( )4.3、xTaskIncrementTick( ) 5、实验5.1、测试5.2、待改进 0、思考与回答 0.1、思考一 为什么 FreeRTO…

MySQL基础——多表查询和事务

目录 1多表关系 2多表查询概述 3连接查询 3.1内连接 3.2左外连接 3.3右外连接 3.4自连接 4联合查询 5子查询 5.1标量子查询(子查询结果为单个值) 5.2列子查询(子查询结果为一列) 5.3行子查询(子查询结果为一行) 5.4表子查询(子查询结果为多行多列) 6事务简介和操…

Axios进阶

目录 axios实例 axios请求配置 拦截器 请求拦截器 响应拦截器 取消请求 axios不仅仅是简单的用基础请求用法的形式向服务器请求数据&#xff0c;一旦请求的端口与次数变多之后&#xff0c;简单的请求用法会有些许麻烦。所以&#xff0c;axios允许我们进行创建axios实例、ax…

MongoDB~分片数据存储Chunk;其迁移原理、影响,以及避免手段

分片数据存储&#xff1a;Chunk存储 Chunk&#xff08;块&#xff09; 是 MongoDB 分片集群的一个核心概念&#xff0c;其本质上就是由一组 Document 组成的逻辑数据单元。每个 Chunk 包含一定范围片键的数据&#xff0c;互不相交且并集为全部数据。 分片集群不会记录每条数据…

计算机组成原理之定点除法

文章目录 定点除法运算原码恢复余数法原码不恢复余数法&#xff08;加减交替法&#xff09;运算规则 习题 定点除法运算 注意 &#xff08;1&#xff09;被除数小于除数的时候&#xff0c;商0 &#xff08;2&#xff09;接下来&#xff0c;有一个除数再原来的基础上&#xff0c…

Vue主要使用-03

组件通讯 组件通讯也是我们需要了解的,在我们的实际开发中,我们使用的非常多,比如父组件内的数据传入到子组件,子组件的数据传入到父组件,什么是父组件什么是子组件&#xff1f;父组件内包含着我们的子组件,我们的父组件可以有多个子组件,父组件就是我们使用子组件拼接的。 …

【字符串】65. 有效数字

本文涉及知识点 字符串 LeetCode65. 有效数字 给定一个字符串 s &#xff0c;返回 s 是否是一个 有效数字。 例如&#xff0c;下面的都是有效数字&#xff1a;“2”, “0089”, “-0.1”, “3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e7”, “6e-1”, “53.5e93”,…

举例说明 如何通过SparkUI和日志定位任务莫名失败?

有一个Task OOM&#xff1a; 通过概览信息&#xff0c;发现Stage 10的Task 36失败了4次导致Job失败。概览信息中显示最后一次失败的退出代码&#xff08;exit code&#xff09;是143&#xff0c;意味着发生了内存溢出&#xff08;OOM&#xff0c;即Out of Memory&#xff09;。…

漏洞分析|PHP-CGI Windows平台远程代码执行漏洞(CVE-2024-4577)

1.漏洞描述 CVE-2024-4577导致漏洞产生的本质其实是Windows系统内字符编码转换的Best-Fit特性导致的&#xff0c;相对来说PHP在这个漏洞里更像是一个受害者。 PHP语言在设计时忽略了Windows系统内部对字符编码转换的Best-Fit特性&#xff0c;当PHP运行在Window平台且使用了如…

一键自动粘贴,高效处理邮箱地址,让你的工作效率翻倍提升!

在信息爆炸的时代&#xff0c;邮箱地址已成为我们日常工作和生活中的必备元素。无论是商务沟通、报名注册还是信息传递&#xff0c;邮箱地址都扮演着至关重要的角色。然而&#xff0c;手动复制粘贴邮箱地址的繁琐操作往往让人头疼不已&#xff0c;不仅效率低下&#xff0c;还容…

锁存器的工作原理及其在FPGA设计中的注意事项

锁存器&#xff08;Latch&#xff09;是数字电子中常用的一种基本元件&#xff0c;用于在特定的时间点或条件下“锁存”或保存输入的数据值。锁存器对脉冲电平敏感&#xff0c;它只在输入脉冲的高电平&#xff08;或低电平&#xff09;期间对输入信号敏感并改变状态。在数字电路…