java spring IOC Bean管理操作讲解 并代码演示xml的实现方式

news2024/11/15 22:41:46

查看本文 需要您使用spring创建过对象管理 如果之前没有接触过 可以先查看我的文章
java 手把手带你创建一个spring入门案例
IOC 操作中 Bean管理主要有两个部分
分别是创建对象和注入属性
他们都有两种实现方式 分别是xml和注解方式实现
本文只演示xml 后续我会出注解方式的文章可以留意一下

创建对象我们入门案例里已经做过了

通过xml文件配置
在这里插入图片描述
在工厂类中读取配置并反射创建
在这里插入图片描述
其中 我们要对 xml bean的属性 做个解释
id 并不是你要应用的这个对象名字 而是 你在xml创建类对象时 给他取一个别名 到时 类或通过这个别名找到他
class 则是要你要创建对象这个类的全路径 包/类
在这里插入图片描述
例如我们这里 gettingStarted包下的user类

而反射创建对象时 spring也会去找到这个无参的构造方法

比如 我们打开我们之前的入门案例 在user类中创建一个有参的构造方法 这样 原本那个无参的构造方法就没了
在这里插入图片描述
我们再次运行项目
在这里插入图片描述
这样我们项目就报异常了 找不到他默认要找的这个无参构造了

这也是bean创建对象的特点之一 会找到默认的 无参构造方法 通过它创建对象

然后是我们的第二个点 属性注入

DI 有些人面试会问 DI和IOC的区别 而DI是IOC的一种具体实现 代表 注入依赖,就是注入属性
按原始的做法 就是在一个类中创建一个属性 然后给这个属性设置一个set方法 从外面赋值 或者是 定义一个属性和一个有参构造 通过构造方法 从外面把值传进去
其实spring中也是主要通过他们来实现

下面我们就来用代码演示一下具体配置

首先是set方法的实现
我们先创建一个项目 然后引入spring需要的几个基本的JAR包

然后在src下创建一个包 叫 gettingStarted
包下创建一个user类 参考代码如下

package gettingStarted;

public class user {
    public String name;
    public int age;

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
}

可以看到 我们这里定义了两个属性 name:用户名称 age:用户年龄 并分别给他们定义了 get和set方法

然后 在src下创建一个 bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- user类的对象创建 -->
    <bean id = "user" class = "gettingStarted.user">
        <property name="name" value = "小猫猫"></property>
        <property name="age" value = "13"></property>
    </bean>
</beans>

这里 我们先通过bean标签 创建了user类的对象 然后通过property给name和age注入了值 name代表对应类中的哪个一属性 value代表需要注入的值
认真看一下还是很好理解的

然后我们在src下的gettingStarted创建一个测试类 text
参考代码如下

package gettingStarted;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class text {
    public static void main(String args[]) {
        //获取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        user user = context.getBean("user",user.class);
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }
}

可以看到 我们还是用了基本的反射方法 创建了这个类的对象 然后调用两个get方法 将结果用System.out.println输出在控制台上 看看我们在xml中定义的属性注入进去没有
我们运行结果如下
在这里插入图片描述
这里也是没有任何问题

这就是Bean管理通过 set注入属性的方法 然后我们来看有参构造的注入方式

还是刚才的代码

我们给user类加一个构造方法 参考代码如下

public user(String name,int age){
    this.name = name;
    this.age = age;
}

在这里插入图片描述
这次 我们将通过它给属性赋值

修改 bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- user类的对象创建 -->
    <bean id = "user" class = "gettingStarted.user">
        <constructor-arg name = "name" value = "小猫猫"></constructor-arg>
        <constructor-arg name = "age" value = "13"></constructor-arg>
    </bean>
</beans>

还是通过bean创建对象 但如果你用了构造方法 那就要通过constructor-arg标签 写明构造方法的传值 name代表你要给那个属性 value则是对应的值是什么
测试类就还是一样的用法

运行结果如下
在这里插入图片描述
也是没有任何问题

不过我们构造方法注入属性 xml还有另一种写法
我们将 bean 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- user类的对象创建 -->
    <bean id = "user" class = "gettingStarted.user">
        <constructor-arg index = "0" value = "小猫猫"></constructor-arg>
        <constructor-arg index = "1" value = "13"></constructor-arg>
    </bean>
</beans>

在这里插入图片描述
这样写运行效果也是一样的 index 代表你要给构造方法中的第几个参数赋值 索引都是从0开始的 所以 我们0找到了 第一个name 而1 找到了第二个age

一个是通过属性名 另一个是通过第几个找到属性并赋值 也都差不多

到这里 我们xml完成 Bean管理的操作就演示完啦

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

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

相关文章

第十三届蓝桥杯省赛 JAVA A组 - 蜂巢

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;蜂巢 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥别的小伙伴整理常考算法题解&#xff0c;祝大家都能…

背包问题——“0-1背包”,“完全背包”(这样讲,还能不会?)

目录 一、0-1背包 1.1、0-1背包解决的问题 1.2、dp数组定义 1.3、转移方程 1.3.1、二维dp数组 1.3.2、一维dp数组 1.4、遍历顺序 1.5、测试代码 1.6、练习 二、完全背包 2.1、完全背包解决问题 2.2、与0-1背包的区别 2.3、测试代码 2.4、拓展问题&#xff1a;装满…

【2022】13 年终总结

新年Flag 2023年&#xff0c;为了各方面能有所进步&#xff0c;列一些希望达成的目标和想做的事&#xff0c;到年底看看效果。 撰写一篇英文论文 申请到CSC 和xl去外地玩两次 想到了再加 去年Flag倒了几个&#xff1f; 一维河网水动力学模型导师说不用自己编&#xff0c;看懂…

Numpy文件交互:.npy和.npz有什么区别?

文章目录saveloadsavezsavez_compressedNumpy提供了以.npy为后缀的文件存储方案&#xff0c;与这种文件格式密切相关的读、写函数分别是np.load和np.save。通过savez可以一次性存储多个数组&#xff0c;并可通过load以键值对的形式读取出来&#xff1b;如果觉得文件太大&#x…

Mybatis缓存

内存中的一块存储空间&#xff0c;服务于某个应用程序&#xff0c;旨在将频繁读取的数据临时保存在内存中&#xff0c;便于二次快速访问。 一级缓存 SqlSession级别的缓存&#xff0c;同一个SqlSession的发起多次同构查询&#xff0c;会将数据保存在一级缓存中。 注意&#x…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(频率特性测试仪)】

目录 序言 &#x1f34d;放置虚拟仪器仪表 &#x1f349;频率特性测试仪 &#x1f34a;&#x1f34a;1.“模式”选项组 &#x1f34a;&#x1f34a;2.“水平”选项组 &#x1f34a;&#x1f34a;3.“垂直”选项组 &#x1f34a;&#x1f34a;4.“控件”选项组 序言 N…

SpringBoot+Vue项目大学生租房平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

数据结构课程设计[2023-01-19]

数据结构课程设计[2023-01-19] 数据结构课程设计 一、课程设计要求 实现指定的题目&#xff08;学号最后两位%41&#xff09;&#xff0c;并撰写课程设计报告。独立完成&#xff0c;功能不完备也没关系&#xff0c;只要是自己做的 使用 C、C或者 JAVA 语言&#xff0c;采用…

​第四章 Flink 窗口和水位线​

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、时间概念&#xff1a;事件时间和处理时间 在流式处理的过程中&#xff0c;数据…

详解微信小程序开发中的“数据绑定”和代码样例

简介 首先需要区分微信小程序的运行环境和框架系统。运行环境为小程序在手机当中运行的时候&#xff0c;微信客户端所能提供的环境支持&#xff0c;也就是在这种环境下如何进行数据渲染工作&#xff1b;框架系统则是微信小程序在进行开发的过程中&#xff0c;如何通过代码实现…

数字逻辑理论——组合电路

利用数据选择器设计组合逻辑电路 m&#xff1a;组合电路输入变量个数 n&#xff1a;数据选择器的控制端个数 &#xff08;1&#xff09;mn 利用8选1数据选择器设计函数&#xff1a;FAB’A’CBC’ 待设计卡诺图&#xff1a; F∑(1,2,3,4,5,6) &#xff08;2&#xff09;m&g…

【每日一题】【LeetCode】【第十九天】【Python】汇总区间

解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 没有想到什么更快的方法&#xff0c;先用两个循环来写出来思路。 class Solution(object):def summaryRanges(self, nums):res []index 0n len(nums)while index < n:if index n - 1:res.append(str…

Spring_FrameWork_07(SpringMVC与SSM整合)

SpringMVC&#xff08;一种基于java实现的轻量级web框架&#xff09; 请求与响应 REST风格 SSM整合 拦截器 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {Overrideprotected WebApplicationContext createServletApplicationCont…

【工具】用AI辅助论文/博客的写作:Obsidian+Text Generator的详细安装教程

目录 前言 介绍 Obsidian Text-Generator 使用教程 安装Obsidian 安装Text Generator 插件安装 获取开放 AI API 密钥 插件选项配置 初体验 前言 对于作家、博主和学生来说&#xff0c;这是一个很好的工具&#xff0c;它通过使用最强大的语言模型之一&#xff1a;Ope…

[数据结构基础]链式二叉树的几个典型的基础oj问题

今年是农历腊月二十九&#xff0c;提前祝大家新春快乐。这是我壬寅虎年最后一篇文章&#xff0c;感谢大家的阅读。祝大家兔年吉祥&#xff0c;身体健康、阖家幸福、学业有成、事业如意、财源滚滚&#xff01; 前置说明 本文中所有用到的二叉树及二叉树节点&#xff0c;都是由…

Fabric中的txid exists问题

Fabric 默认配置中tls证书有效期为一年&#xff0c;相信挖了不少的坑&#xff0c;我前段时间写了篇文章介绍了下解决的思路&#xff0c;但是自己真解决起来还是没解决问题&#xff0c;这种分布式企业架构太复杂。 最近有遇到一个奇怪的问题&#xff0c;小伙伴写的存证数据&…

plt自定义水平线和垂直线、水平区域和垂直区域

一、添加x轴y轴垂直辅助线 1、函数 axvline函数&#xff1a;绘制垂直线。axhline函数&#xff1a;绘制水平线。 2、参数 plt.axvline(x0, ymin0, ymax1, c"g", ls"--", lw2, labelNone)。axhline类似 x&#xff1a;垂直线在x轴上的位置。浮点数&#xf…

AcWing1227.分巧克力——学习笔记

目录 题目 代码 AC结果 思路&#xff1a; 一、设置全局变量 二、获取数据 三、当前大小可得到的巧克力数是否满足每个小朋友至少分到一块 四、二分法找每个小朋友可得到的最大大小 题目 1227. 分巧克力 - AcWing题库https://www.acwing.com/problem/content/descripti…

Python---函数相关知识

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 函数前言函数的使用函数的语法格式函数的参数函…

Python脚本集成SQLite3数据库

文章目录一、Sqlite3数据库的基本使用1.数据库是什么2.数据库分类二、正式开始使用SQLite3&#xff08;Python&#xff09;1.基础sql命令2.Python连接SQLite3①查询②增加③更新一、Sqlite3数据库的基本使用 1.数据库是什么 借用百科上的话&#xff0c;数据库是“按照数据结构…