spring学习(spring-bean实例化(无参构造与有参构造方法实现)详解)
目录
一、spring容器之bean的实例化。
(1)"bean"基本概念。
(2)spring-bean实例化的几种方式。
二、spring容器使用"构造方法"的方式实例化bean。
(1)无参构造方法实例化bean。
(2)有参构造方法实例化bean。
1、新建一个类"Student",并交给spring容器管理。
2、使用子标签<constructor-arg>完成bean配置。
3、有参构造方法的参数为多个时(index与value)。
4、标签<constructor-arg>内使用"name"属性。
(3)使用场景。
-
本篇博客的主要内容是使用(构造方法或静态工厂)实现spring-bean实例化。
一、spring容器之bean的实例化。
(1)"bean"基本概念。
- spring框架中总是有"bean"这个词出现!它的本质上就是对象。
- spring容器管理的对象叫bean。
- 在Java基础的学习中,创建对象通常都是使用new+构造方法。
- 对应spring容器来说,它也是可以通过构造方法完成bean的创建!
(2)spring-bean实例化的几种方式。
二、spring容器使用"构造方法"的方式实例化bean。
(1)无参构造方法实例化bean。
- 注意:每个类会默认提供一个无参构造方法。就算未写,也是调用了无参构造方法。但如果手动提供了有参构造方法,一般一定记得再手动提供无参构造方法。
- spring容器是可以通过无参构造方法实例化bean的。下面通过demo(案例)进行演示。
- spring的简单demo项目的结构组成与介绍。
- spring配置文件。(目前只配置了"UserDaoImpl"的bean)
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--生产UserDao实现类的对象--><bean id="userDao" class="com.fs.dao.impl.UserDaoImpl"></bean> </beans>
UserDao接口。
package com.fs.dao; //UserDao接口 public interface UserDao {void add(); }
UserDaoImpl实现类。
package com.fs.dao.impl;import com.fs.dao.UserDao; //UserDao接口的实现类 public class UserDaoImpl implements UserDao {//手动添加无参构造方法public UserDaoImpl() {System.out.println("UserDaoImpl无参构造方法执行了");}//实现UserDao接口中的add方法@Overridepublic void add() {System.out.println("UserDaoImpl执行了add方法");} }
程序的测试类。
package com.fs.test;import com.fs.dao.impl.UserDaoImpl; import org.springframework.context.support.ClassPathXmlApplicationContext;//运行测试程序 public class MainApp {public static void main(String[] args) {//使用IoC容器(ApplicationContext)获取spring容器管理的bean对象//1.创建容器对象。实例化时参数指定对应的配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springConfig.xml");//2.通过<bean>标签的唯一标识id获取对应UserDao接口的实现类"UserDaoImpl"的实例对象Object obj = context.getBean("userDao");//3.强制类型转换UserDaoImpl userDao = (UserDaoImpl)obj;userDao.add();} }
demo的运行结果。
如果将无参构造方法public设置成private权限,spring容器还能够帮忙实例化对象吗?
在以前的new+构造方法时显然是不能够的!但是spring容器却可以!无论提供的无参构造方法是公共的还是私有的,spring容器都能够调用到该无参构造方法。
这就是涉及到spring容器内部底层工作原理——反射机制。这个后面再详细学习,现在只需要知道spring容器是可以拿构造方法实例化bean就行了。
是否可以直接不做任何操作让spring容器使用有参构造方法实例化bean?
答案是不行的。因为spring创建的bean的时候是默认调用无参构造方法。
- 查看spring的报错信息可以一层一层的往上分析。
(2)有参构造方法实例化bean。
package com.fs.a;public class Student {}
- 上面得demo中spring容器默认使用无参构造方法实例化bean时。当把无参构造方法变成有参构造方法,不仅仅程序中会报错,xml文件中也会报错!
1、新建一个类"Student",并交给spring容器管理。
package com.fs.a;public class Student { //类中提供一个有参构造方法public Student(String name){System.out.println("参数是:"+name);} }
- 这时像原先通过无参构造方法完成bean实例化的spring配置文件已经报错!因为此时只提供了有参构造方法,而未提供无参构造方法。
2、使用子标签<constructor-arg>完成bean配置。
- <bean>标签中的子标签<constructor-arg>用于指定构造函数参数。这样以便在spring容器创建bean时传递给相应的构造函数。
- "value"属性的值就是给对应有参构造方法的参数变量赋值。
<!--配置Student类的对象--><bean id="student" class="com.fs.a.Student"><constructor-arg value="zhangsan"/></bean>
- 测试类MainApp02代码。也是一样的使用ApplicationContext容器的加载spring配置文件与getBean()拿取spring容器管理的对象(Student类)。
package com.fs.test;import com.fs.a.Student; import org.springframework.context.support.ClassPathXmlApplicationContext;//测试类2 public class MainApp02 {public static void main(String[] args) {//使用IoC容器(ApplicationContext)获取spring容器管理的bean对象//1.创建容器对象。实例化时参数指定对应的配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springConfig.xml");//2.通过<bean>标签的唯一标识id获取对应UserDao接口的实现类"UserDaoImpl"的实例对象Object obj = context.getBean("student");//3.强制类型转换Student student = (Student)obj;System.out.println(student);} }
- 测试运行!
3、有参构造方法的参数为多个时(index与value)。
- 修改Student类的有参构造方法。
package com.fs.a;public class Student { //类中提供一个有参构造方法public Student(String name,int age){System.out.println("参数是:"+name+",年龄是:"+age);} }
- 此时spring的配置文件又出现了报错!
- 在子标签<constructor-arg>中除了给"value"属性赋值外,还需要指定参数的位置(索引)属性"index"的值,这样一一对应了有参构造方法的参数值。
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--生产UserDao实现类的对象<bean id="userDao" class="com.fs.dao.impl.UserDaoImpl"></bean>--><!--配置Student类的对象--><bean id="student" class="com.fs.a.Student"><constructor-arg index="0" value="李四"/><constructor-arg index="1" value="18"/></bean></beans>
- 此时再运行测试类(MainApp02)程序查看结果。
- 若给int类型的age赋值一个字符串,spring配置文件中也会报错提示。
- 删去<bean>标签内对应的配置<constructor-arg>。就会报错(没有默认的无参构造:No default constructor found)
4、标签<constructor-arg>内使用"name"属性。
- 用"name"属性指定有参构造方法的参数,就不需要像"index"属性那样需要按顺序去赋值"value"属性。
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--生产UserDao实现类的对象<bean id="userDao" class="com.fs.dao.impl.UserDaoImpl"></bean>--><!--配置Student类的对象--><!--<bean id="student" class="com.fs.a.Student"><constructor-arg name="name" value="wangwu"/><constructor-arg name="age" value="18"/></bean>--><bean id="student" class="com.fs.a.Student"><constructor-arg name="age" value="18"/><constructor-arg name="name" value="wangwu"/></bean></beans>(3)使用场景。
- 当我们使用第三方的技术时,将它们也交给spring容器进行管理。
- 我们学会了无参构造与有参构造方法实例化bean时,就可以直接使用spring容器管理并获得bean对象。
- 本篇博客对于博主来说,还有待完善。
相关文章:
spring学习(spring-bean实例化(无参构造与有参构造方法实现)详解)
目录 一、spring容器之bean的实例化。 (1)"bean"基本概念。 (2)spring-bean实例化的几种方式。 二、spring容器使用"构造方法"的方式实例化bean。 (1)无参构造方法实例化bean。 &#…...
Arm Cortex-M处理器对比表
Arm Cortex-M处理器对比表 当前MCU处理器上主要流行RISC-V和ARM处理器,其他的内核相对比较少;在这两种内核中,又以Arm Cortex-M生态环境相对健全,大部分的厂家都在使用ARM的处理器。本文主要介绍Arm Cortex-M各个不同系列的参数对…...
【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge
文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1:git merge(保留分支结构)方法 2:git rebase(线性合并提交历史)直接在master分支执行git merge br_feature,再 执行 git pull --reba…...
WPF 相比 winform 的优势
wpf 相比 winform 的一些优点,网上也是众说纷纭,总的来说包括下面几点: 丰富的视觉效果:能够创建更具吸引力和现代化的用户界面,支持更复杂的图形和动画效果。不需要像 winform 一样,稍微做一点效果&#x…...
PYQT5程序框架
pyqt5程序框架_哔哩哔哩_bilibili 1.UI代码 Qhkuja.py # -*- coding: utf-8 -*-# Form implementation generated from reading ui file Qhkuja.ui # # Created by: PyQt5 UI code generator 5.15.7 # # WARNING: Any manual changes made to this file will be lost when py…...
Linux 中的 mkdir 命令:深入解析
在 Linux 系统中,mkdir 命令用于创建目录。它是文件系统管理中最基础的命令之一,广泛应用于日常操作和系统管理中。本文将深入探讨 mkdir 命令的功能、使用场景、高级技巧,并结合 GNU Coreutils 的源码进行详细分析。 1. mkdir 命令的基本用法…...
【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
Linux栈帧
相关寄存器&指令 寄存器 rax(accumulator):return value rbx(base) rcx(count):4st argument rdx(data):3st argument rsi(sour…...
leetcode刷题——回溯算法(1)
目录 77题. 组合 216.组合总和III 17.电话号码的字母组合 39. 组合总和 40.组合总和II 131.分割回文串 93.复原IP地址 78.子集 90.子集II 491.非递减子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独 回溯的本质是穷举,穷举所有…...
3D相框案例讲解(详细)
前言 通过现阶段的学习,我们已经掌握了HTML,CSS和JS部分的相关知识点,现在让我们通过一篇案例,来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…...
制作安装包
使用打包工具(如 NSIS、Inno Setup、Advanced Installer)制作安装包。 示例:Inno Setup 制作安装包 Inno Setup Inno Setup 是一个免费且强大的安装包制作工具,可以用来打包 Qt 项目或其他软件程序。以下是使用 Inno Setup 制作…...
P8615 拼接平方数 P8699 排列数
文章目录 [蓝桥杯 2014 国 C] 拼接平方数[蓝桥杯 2019 国 B] 排列数 [蓝桥杯 2014 国 C] 拼接平方数 题目描述 小明发现 49 49 49 很有趣,首先,它是个平方数。它可以拆分为 4 4 4 和 9 9 9,拆分出来的部分也是平方数。 169 169 169 也有…...
【C语言】拆解C语言的编译过程
前言 学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...
【C++】青蛙跳跃问题解析与解法
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述第一部分:基本青蛙过河问题第二部分:石柱和荷叶问题 💯解题思路与分析第一部分:青蛙过河问题解法思路:递…...
自动驾驶AVM环视算法--python版本的俯视TOP投影模式
c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线,获取方式网盘自行获取(非免费介意勿下载):链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...
Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅
一、引言 结对编程作为一种软件开发方法,在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心,深入探讨时间拳击理论下的结对编程。 在当今软件开发领域,高效的开发方法和…...
Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
ElasticSearch 常见故障解析与修复秘籍
文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高,read_only状态问题解决六…...
序列模型的使用示例
序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络(RNN)1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN(1)RNN实例化(2)forward函数(3…...
对rust的全局变量使用drop方法
文章目录 rust处理全局变量的策略方法1:在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop,因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...
AI 面试系统设计题怎么准备?5 个完整案例 + 回答框架
AI 面试系统设计题怎么准备?5 个完整案例 回答框架(CSDN 教程版) 摘要:系统设计题是 AI 面试中最能拉开差距的环节。本文提供 5 个完整案例和通用回答框架,帮助工程师高效准备 AI 面试系统设计题。 前言 系统设计题是…...
intv_ai_mk11一文详解:7B参数轻量级开源对话模型在中小团队中的降本增效实践
intv_ai_mk11一文详解:7B参数轻量级开源对话模型在中小团队中的降本增效实践 1. 轻量级AI对话助手的价值定位 在中小团队的实际运营中,专业AI助手的引入往往面临两大难题:高昂的部署成本和复杂的技术门槛。intv_ai_mk11作为7B参数的轻量级开…...
Android开发秘籍:给图片加上独特水印
Android开发秘籍:给图片加上独特水印 为什么要给图片加水印 在当今这个信息飞速传播的时代,图片作为一种直观且富有表现力的信息载体,在我们的生活和工作中无处不在。无论是在社交媒体上分享的精美摄影作品,还是电商平台上展示的…...
Qwen3.5-9B-AWQ-4bit惊艳效果展示:高清图识+中文摘要真实生成作品集
Qwen3.5-9B-AWQ-4bit惊艳效果展示:高清图识中文摘要真实生成作品集 1. 模型能力概览 Qwen3.5-9B-AWQ-4bit是一款让人眼前一亮的视觉理解模型,它能像人类一样"看懂"图片内容,并用流畅的中文给出专业分析。这个模型特别擅长处理各种…...
告别复杂配置!Phi-3-Mini-128K一键部署实测:7GB显存跑通,小白也能玩转大模型
告别复杂配置!Phi-3-Mini-128K一键部署实测:7GB显存跑通,小白也能玩转大模型 1. 为什么选择Phi-3-Mini-128K 如果你正在寻找一个既强大又轻量的大语言模型,Phi-3-Mini-128K绝对值得考虑。这个由微软开发的模型虽然只有3.8亿参数…...
Flux Sea Studio 极限测试:生成8K超高清巨幅海景壁纸的技术挑战与实现
Flux Sea Studio 极限测试:生成8K超高清巨幅海景壁纸的技术挑战与实现 最近在折腾AI生成图片,发现一个挺有意思的挑战:用Flux Sea Studio这类模型,能不能做出那种能铺满整块大屏幕的、细节拉满的8K超高清壁纸?特别是海…...
【回眸】头马演讲备稿演讲框架——出走的莉莉丝
其实我原本是不知道莉莉丝的,在坐有人知道莉莉丝的故事吗?(互动一下)莉莉丝本来和亚当一样,也是一个人,但她为了追求与亚当平等,逃脱了伊甸园,于是一根“肋骨”变成了夏娃࿰…...
从MySQL到Doris:手把手教你无缝迁移数据模型(附分区分桶实战配置)
从MySQL到Doris:数据模型迁移实战与分区分桶深度优化 如果你正在使用MySQL处理海量数据分析任务,可能会遇到查询性能瓶颈、复杂聚合计算效率低下等问题。Apache Doris作为新一代MPP分析型数据库,兼容MySQL协议却提供了完全不同的底层架构设计…...
APRSPacketLib:嵌入式C库实现APRS协议编解码
1. APRSPacketLib 项目概述 APRSPacketLib 是一个专为业余无线电(Ham Radio)领域设计的轻量级嵌入式 C 语言库,核心目标是 在资源受限的微控制器平台上高效完成 APRS(Automatic Packet Reporting System)协议数据包的…...
Agent在零售行业能解决哪些痛点?——深度解析零售企业智能自动化转型路径
在2026年零售行业加速迈向智能化的背景下,AI Agent(人工智能智能体)已不再仅仅是技术实验室的产物,而是演变为重构行业价值链的核心驱动力。传统的零售运营长期受困于人力密集型模式,面临着全球化运营复杂度高、数据孤…...













