当前位置: 首页 > article >正文

spring:实例化类过程中方法执行顺序。

如题。在实例化Bean时,会根据配置依次调用方法。在此测试代码如下:

在测试类中继承接口InitializingBean,接口InterfaceUserService(该接口为自定义,只是定义set方法)。

InterfaceUserService,接口InterfaceUserDao不影响测试,

package com.itheima.service.interfaces;import com.itheima.dao.interfaces.InterfaceUserDao;/*** @copyright 2003-2024* @author    qiao wei* @date      2024-12-22* @version   1.0* @brief     * @history   name*            date*            brief*/
public interface InterfaceUserService {void show();void setUserDao001(InterfaceUserDao userDao);
}

测试类UserServiceImpl02

package com.itheima.service.impl;import org.springframework.beans.factory.InitializingBean;import com.itheima.dao.interfaces.InterfaceUserDao;
import com.itheima.service.interfaces.InterfaceUserService;/*** @copyright 2003-2024* @author    qiao wei* @date      2024-12-23* @version   1.0* @brief     有参构造方法。* @history   name*            date*            brief*/
public class UserServiceImpl02 implements InterfaceUserService, InitializingBean {public UserServiceImpl02() {System.out.println("类UserServiceImpl02调用无参构造函数。");}public UserServiceImpl02(InterfaceUserDao paramUserDao, double paramValue) {this.userDao = paramUserDao;this.value01 = paramValue;System.out.println("调用带参构造方法");
//        paramUserDao.print();
//        System.out.println("类UserServiceImpl02调用有参构造函数。---" + userDaoABC);
//        System.out.println(value01);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("实现接口InitializingBean的方法afterPropertiesSet");}@Overridepublic void show() {System.out.println("类UserServiceImpl02的show方法。");System.out.println("打印字段数据。userDao:" + userDao + ",value01:" + value01);System.out.println(userDaoABC);}@Overridepublic void setUserDao001(InterfaceUserDao userDao) {System.out.println("调用属性设置方法。");this.userDaoABC = userDao;}private InterfaceUserDao userDao;private InterfaceUserDao userDaoABC;private double value01;
}

配置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"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd"><bean id="serviceImpl02"class="com.itheima.service.impl.UserServiceImpl02"><!--    构造方法参数    --><constructor-argname="paramUserDao"ref="userDao"></constructor-arg><constructor-argname="paramValue"value="100.0"></constructor-arg><!--    setUserDao001方法参数    --><property name="userDao001"ref="userDao"></property></bean><bean id="userDao"class="com.itheima.dao.impl.UserDaoImpl"></bean>
</beans>

Test类

package com.itheima.service.impl;import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.itheima.service.interfaces.InterfaceUserService;import static org.junit.jupiter.api.Assertions.*;/*** @copyright 2003-2025* @author    qiao wei* @date      2025-04-02* @version   1.0* @brief     * @history   name*            date*            brief*/
class UserServiceImpl02Test {@Testpublic void test02() {ClassPathXmlApplicationContext applicationContext =new ClassPathXmlApplicationContext("./xml/service/userServiceImpl02.xml");InterfaceUserService userService =(InterfaceUserService) applicationContext.getBean("serviceImpl02");
//        userService.show();}
}

运行结果如下:

在xml文件中没有配置init-method,如果配置了,应在方法afterPropertiesSet之后被调用。注意,因为在xml配置了构造方法的参数,所以在有无参、有参两个构造方法的情况下,调用了有参构造方法。

如果将xml文件中的构造方法参数注释掉,则运行结果自动调用无参构造方法。

注释掉的xml文件内容

运行结果:

所以在创建Bean'实例时,方法调用顺序如下:

构造方法

set***方法

接口InitializingBean的方法afterPropertiesSet。(如果继承接口 InitializingBean)。

xml配置的init-method方法。

 

http://www.lryc.cn/news/2402930.html

相关文章:

  • 设置应用程序图标
  • 「基于连续小波变换(CWT)和卷积神经网络(CNN)的心律失常分类算法——ECG信号处理-第十五课」2025年6月6日
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务
  • 视频的分片上传,断点上传
  • CSS 性能优化
  • 华为×小鹏战略合作:破局智能驾驶深水区的商业逻辑深度解析
  • 4D毫米波雷达产品推荐
  • yolo 训练 中间可视化
  • Rust 学习笔记:关于 Cargo 的练习题
  • 光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • 20250606-C#知识:委托和事件
  • AI数字人技术革新进行时:井云数字人如何重塑人机交互未来?
  • ruoyi-plus-could 负载均衡 通过 Gateway模块配置负载均衡
  • 江科大读写内部flash到hal库实现
  • Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!
  • 主流 AI IDE 之一的 Cursor 介绍
  • 0x-1 记一次SGA PGA设置失败,重新开库
  • 【科研绘图系列】R语言绘制和弦图(Chord diagram plot)
  • PPT转图片拼贴工具 v3.0
  • 关于安科瑞APD局部放电监测装置解决方案的应用分析
  • 设计模式-2 结构型模式
  • 大量企业系统超龄服役!R²AIN SUITE 一体化企业提效解决方案重构零售数智化基因
  • Cesium使用glb模型、图片标记来实现实时轨迹
  • 【拓扑剪枝+深搜剪枝/计数】2024睿抗-章鱼图的判断
  • Android基础回顾】六:安卓显示机制Surface 、 SurfaceFlinger、Choreographer
  • SpringBoot核心注解详解及3.0与2.0版本深度对比
  • 敏捷开发中如何避免过度加班
  • 深入浅出多路归并:原理、实现与实战案例解析
  • Java八股文——集合「Map篇」