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

本文主要是介绍Spring5中IOC创建对象的方式(有参与无参)与时机(附三类无参创建代码供参考),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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/beanshttps://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/beanshttps://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强转成我需要的对象UserUser user = context.getBean("user", User.class);user.show();}
}

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

了解更多知识请戳下:

@Author:懒羊羊

这篇关于Spring5中IOC创建对象的方式(有参与无参)与时机(附三类无参创建代码供参考)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067117

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud