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对象。
  • 本篇博客对于博主来说,还有待完善。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等

关于QT Widget 其它文章请点击这里: QT Widget GitHub 源码: QWidgetLearningPro &#xff08;暂未更新&#xff09; 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 预览 一、简介 QtPdfium 是基于Pdfium库的一个Qt绑定。Pdfium是一个…

【Leecode】Leecode刷题之路第82天之删除排序链表中的重复元素II

题目出处 82-删除排序链表中的重复元素 II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 82-删除排序链表中的重复元素 II-官方解法 方法1&#xff1a;一次遍历 思路&#xff1a; 代码…

IDEA 可视化使用 git rebase 合并分支步骤 使git分支树保持整洁

模拟环境 dev 分支开发完一个功能&#xff0c;需要合并到 master 分支&#xff0c;如果现在直接 merge 合并的话 git分支树会出现杂乱分叉&#xff0c;先把 master 分支 rebase 到 dev git分支树就会是整洁的一条直线 git rebase介绍 rebase:翻译成中文是重新设定&#xff0c;…

短信验证码burp姿势

首先声明&#xff0c;本文仅仅作为学习使用&#xff0c;因个人原因导致的后果&#xff0c;皆有个人承担&#xff0c;本人没有任何责任。 在之前的burp学习中&#xff0c;我们学习了图片验证码的突破&#xff0c;但是现实中还有很多短信验证码&#xff0c;在此我介绍几种短信验…

你知道OSI参考模型是什么吗?

你知道OSI参考模型是什么吗&#xff1f; 一. OSI模型图解二. OSI七层模型三. OSI模型的特点四. OSI模型与TCP/IP模型的对比五. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱…

好用便签好用在哪里?

在这个信息如潮水般涌来&#xff0c;生活节奏快得像开了倍速的时代&#xff0c;我们的大脑常常被各种事务塞得满满当当&#xff0c;仿佛一台即将 “死机” 的电脑。这时候&#xff0c;我希望有一些工具能帮我轻松梳理这团乱麻&#xff0c;让一切变得井井有条。 从时间管理的维度…

Codeforces Round 993 (Div. 4)

Codeforces Round 993 (Div. 4) 2024.12.15 rank289 123&#xff1a;1381->1504 A Cube is given an integer n n n. She wants to know how many ordered pairs of positive integers ( a , b ) (a,b) (a,b) there are such that a n − b an-b an−b. Since Cube is…

Linux中的service命令

service命令 在Linux系统中&#xff0c;service命令是用来启动、停止、重启以及查看系统服务状态的一个常用命令。服务&#xff0c;或称为守护进程&#xff0c;是在后台运行的进程&#xff0c;它们通常会监听某个端口&#xff0c;等待其他程序的请求。例如&#xff0c;MySQL、…

R环境配置 以及Debug方法 (VSCode, conda, 远程R)

生物信息学中的R环境配置 以及Debug方法 开始设置1、建议使用VSCode conda 远程R2、 VSCode配置安装插件安装好插件后&#xff0c;远程设置链接成功后&#xff0c;设置项目 3、 linux conda 和 远程R配置4、VScode 远程访问R环境下面配置远程R 5、开始Debug新建个R文件&#…

druid图形化监控 + MyBatis优化器使用

文章目录 1.集成druid图形化监控1.配置application.yml2.测试访问 http://localhost:项目端口/druid 2.MyBatis优化器(显示完整sql)1.目录2.SqlBeautyInterceptor.java&#xff1a;sql拦截器3.MybatisConfiguration.java&#xff1a;将sql拦截器注入容器4.测试5.MyBatis优化器动…

【经验分享】私有云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

Unity 2020、2021、2022、2023、6000下载安装

Unity 2020、2021、2022、2023、6000 下载安装 以Unity 6000.0.24fc1下载安装为例&#xff1a; 打开 https://unity.cn/ 优三缔 官方网站&#xff1b; 点击【产品列表】→点击【查看更多】→选择自己需要的版本→点【开始使用】 点击【从Unity Hub下载】 以Windows为例&am…

240004】基于maven的java+ssm+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…

NEEP-EN2-2023-Section5PartB

题目 个人答案 The chart depicts the outcomes of a survey conducted in a specific university regarding the acquisition of practical activity in class. The chart illustrates that learning knowledges accounts for 91.3 percent, which is the highest percentage…

WPF 控件

<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> WPF基础控件 按钮控件&#xff1a; Button:按钮 RepeatButton:长按按钮 RadioButton:单选按钮 数据显示控件 Te…

系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)

每日禅语 “木末芙蓉花&#xff0c;山中发红萼&#xff0c;涧户寂无人&#xff0c;纷纷开自落。​”这是王维的一首诗&#xff0c;名叫《辛夷坞》​。这首诗写的是在辛夷坞这个幽深的山谷里&#xff0c;辛夷花自开自落&#xff0c;平淡得很&#xff0c;既没有生的喜悦&#xff…

ESP8266 Ubuntu 安装

文章参考&#xff1a;https://blog.csdn.net/AUST_129/article/details/119406722文章浏览阅读1.8k次&#xff0c;点赞4次&#xff0c;收藏19次。参考&#xff1a;https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/linux-setup.htmlhttp://aicloud…

软件压力测试和负载测试有什么联系与区别?

在当今数字化时代&#xff0c;软件质量的重要性愈发凸显。在各种软件测试中&#xff0c;压力测试和负载测试都属于性能测试中的一种测试方法&#xff0c;那么这两者分别是什么?又有什么联系和区别呢? 一、压力测试和负载测试的定义   压力测试通常是指在特定的环境中&…

C# 异常处理 详解

总目录 前言 一、异常 1、定义 异常是在程序执行期间出现的问题。 C# 中的异常是对程序运行时出现的特殊情况的一种响应&#xff0c;比如尝试除以零。 异常&#xff1a;程序员必须控制和解决的问题。程序可以正常的运行&#xff0c;但是在运行的过程中出现了问题&#xff0c;…

类OCSP靶场-Kioptrix系列-Kioptrix Level 2

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 2.漏洞发现 2.1. 登录框测试 2.2. 发现命令执行 2.3 构造命令执行利用payload 3.提权 3.1. 搜索提权exp 3.2. 查看exp信息 3.3. Privilege Escalation的exp利用 exp_9542 一、前…