【SSM框架】依赖注入

news2024/11/25 18:48:50

🍓个人主页:个人主页

🍒系列专栏:SSM框架

目录

1.依赖注入之setter注入

2.依赖注入之构造器注入

3.特殊值处理

4.为类类型属性赋值

5.为数组类型属性赋值


1.依赖注入之setter注入

①创建学生类 Student
package com.atguigu.spring.pojo;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

②配置bean时为属性赋值

    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1001"></property>
        <property name="name" value="田"></property>
        <property name="age" value="21"></property>
        <property name="sex" value="男"></property>
    </bean>

③测试

    @org.junit.Test
    public void testHelloWorld(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = ac.getBean(Student.class);
        System.out.println(student);


    }

2.依赖注入之构造器注入

①在Student类中添加有参构造

    public Student(Integer id, String name, Integer age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

②配置 bean
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <constructor-arg value="1002"></constructor-arg>
        <constructor-arg value="王"></constructor-arg>
        <constructor-arg value="22"></constructor-arg>
        <constructor-arg value="女" name="sex"></constructor-arg>
    </bean>
注意:
constructor-arg 标签还有两个属性可以进一步描述构造器参数:
  • index属性:指定参数所在位置的索引(从0开始)
  • name属性:指定参数名

③测试

    @org.junit.Test
    public void testHelloWorld(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = ac.getBean(Student.class);
        System.out.println(student);


    }

3.特殊值处理

①字面量赋值

什么是字面量?
int a = 10;
声明一个变量 a ,初始化为 10 ,此时 a 就不代表字母 a 了,而是作为一个变量的名字。当我们引用 a
的时候,我们实际上拿到的值是 10
而如果 a 是带引号的: 'a' ,那么它现在不是一个变量,它就是代表 a 这个字母本身,这就是字面
量。所以字面量没有引申含义,就是我们看到的这个数据本身。
<!-- 使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量 -->
<property name="name" value="张三"/>

null
<property name="name">
<null />
</property>
注意:
<property name="name" value="null"></property>
以上写法,为 name 所赋的值是字符串 null
xml 实体
<!-- 小于号在XML文档中用来定义标签的开始,不能随便使用 -->
<!-- 解决方案一:使用XML实体来代替 -->
<property name="expression" value="a &lt; b"/>
CDATA
<property name="expression">
<!-- 解决方案二:使用CDATA节 -->
<!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据 -->
<!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析 -->
<!-- 所以CDATA节中写什么符号都随意 -->
<value><![CDATA[a < b]]></value>
</property>

4.为类类型属性赋值

①创建班级类 Clazz
public class Clazz {
    private Integer clazzId;
    private String clazzName;

    public Integer getClazzId() {
        return clazzId;
    }

    public String getClazzName() {
        return clazzName;
    }

    public void setClazzId(Integer clazzId) {
        this.clazzId = clazzId;
    }

    public void setClazzName(String clazzName) {
        this.clazzName = clazzName;
    }

    @Override
    public String toString() {
        return "Clazz{" +
                "clazzId=" + clazzId +
                ", clazzName='" + clazzName + '\'' +
                '}';
    }
}

②修改 Student
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private Clazz clazz;

    public Student() {
    }

    public Student(Integer id, String name, Integer age, String sex, Clazz clazz) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.clazz = clazz;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Clazz getClazz() {
        return clazz;
    }

    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", clazz=" + clazz +
                '}';
    }
}

③方式一:引用外部已声明的 bean
配置Clazz类型的bean
    <bean id="clazz" class="com.atguigu.spring.pojo.Clazz">
        <property name="clazzId" value="1"></property>
        <property name="clazzName" value="计算机科学与技术"></property>
    </bean>
Student中的clazz属性赋值:
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1004"></property>
        <property name="name" value="刘"></property>
        <property name="age" value="31"></property>
        <property name="sex" value="男"></property>
        <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
        <property name="clazz" ref="clazz"></property>


    </bean>
错误演示:
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1004"></property>
        <property name="name" value="刘"></property>
        <property name="age" value="31"></property>
        <property name="sex" value="男"></property>
        <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
        <property name="clazz" value="clazz"></property>


    </bean>
如果错把 ref 属性写成了 value 属性,会抛出异常:
                                                                                  
Caused by: java.lang.IllegalStateException:
Cannot convert value of type 'java.lang.String' to required type
'com.atguigu.spring.bean.Clazz' for property 'clazz': no matching editors or conversion
strategy found
意思是不能把 String 类型转换成我们要的 Clazz 类型,说明我们使用 value 属性时, Spring 只把这个属性看做一个普通的字符串,不会认为这是一个bean id ,更不会根据它去找到 bean 来赋值
④方式二:内部 bean
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1004"></property>
        <property name="name" value="赵六"></property>
        <property name="age" value="26"></property>
        <property name="sex" value="女"></property>
        <property name="clazz">
            <!-- 在一个bean中再声明一个bean就是内部bean -->
            <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
            <bean id="clazzInner" class="com.atguigu.spring.pojo.Clazz">
                <property name="clazzId" value="2"></property>
                <property name="clazzName" value="软件工程"></property>
            </bean>
        </property>
    </bean>

③方式三:级联属性赋值
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1004"></property>
        <property name="name" value="赵六"></property>
        <property name="age" value="26"></property>
        <property name="sex" value="女"></property>
        <!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 -->
        <property name="clazz" ref="clazz"></property>
        <property name="clazz.clazzId" value="3333"></property>
        <property name="clazz.clazzName" value="最强王者班"></property>
    </bean>

5.为数组类型属性赋值

①修改 Student
Student 类中添加以下代码:
private String[] hobbies;

public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}

public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", clazz=" + clazz +
                ", hobbies=" + Arrays.toString(hobbies) +
                '}';
    }
②配置 bean
    <bean id="student" class="com.atguigu.spring.pojo.Student">
        <property name="id" value="1004"></property>
        <property name="name" value="赵六"></property>
        <property name="age" value="26"></property>
        <property name="sex" value="女"></property>

        <property name="clazz">
            <!-- 在一个bean中再声明一个bean就是内部bean -->
            <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
            <bean id="clazzInner" class="com.atguigu.spring.pojo.Clazz">
                <property name="clazzId" value="2"></property>
                <property name="clazzName" value="软件工程"></property>
            </bean>
        </property>

        <property name="hobbies">
            <array>
                <value>吃饭</value>
                <value>睡觉</value>
                <value>打豆豆</value>
            </array>
        </property>
    </bean>

14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》

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

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

相关文章

09【SpringMVC的Json支持】

文章目录三、Json的支持3.1 响应json3.1.1 ResponseBody3.1.2 JsonIgnore3.1.3 JsonFormat3.1.4 ResponseEntity3.1.5 作用在类上3.1.6 RestController3.2 请求Json3.2.1 RequestBody3.2.2 HttpEntity3.2.3 封装Json数据三、Json的支持 SpringMVC支持自动将JSON转换成Java对象…

ubuntu更换清华源

进入&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择你的ubuntu版本 vi /etc/apt/sources.list 如果执行apt update 报镜像源证书错误 &#xff08;1&#xff09;将/etc/apt/sources.list中的https改为http, 然后执行apt update&#xff1b; &#…

Linux进程状态

目录 一、普适操作系统的进程状态 1.什么是进程状态 2.三种重要的进程状态 &#xff08;1&#xff09;运行状态 &#xff08;2&#xff09;阻塞状态 &#xff08;3&#xff09;挂起状态 二、Linux源代码中的进程状态 三、Linux进程状态 1.运行状态 2.睡眠状态&#x…

AI加速(九): 深度理解吞吐量和延时

前文回顾&#xff1a; AI加速&#xff08;二&#xff09;| 计算机存储和计算的分离 AI加速&#xff08;三&#xff09;| 每条指令都是流水线的工人 AI加速&#xff08;四&#xff09;| 衣柜般的分层存储设计 AI加速&#xff08;五&#xff09;| 一个例子看懂流水——从指令到…

Java多线程之Thread和Runnable以及Callable接口多线程的简单实现(适合小白入门,十分简单)

Java多线程之Thread和Runnable一、介绍1、程序2、进程3、线程4、整体思路5、注意二、Thread1、思路流程2、样例代码3、多线程下载图片三、Runnable1、思路流程2、样例代码3、多线程下载图片四、Callable接口&#xff08;仅作了解&#xff09;1、具体流程2、优点3、样例五、两者…

视频编解码 — SVC可伸缩性

目录 SVC分层 时域SVC 空域SVC 在一对多的情况下&#xff0c;根据每个接收端的带宽不同&#xff0c;灵活调整发送码率 SVC分层 第0层&#xff0c;最底层&#xff0c;可以独立进行编解码&#xff0c;不依赖第1&#xff0c;第2层第1层&#xff0c;依赖于第0层第2层&#xff…

Linux中的/proc文件系统详解(C/C++代码实现)

Linux /proc这个特殊的目录包含有关Linux系统的所有详细信息&#xff0c;包括其内核、进程和配置参数。通过研究/proc目录&#xff0c;可以了解Linux命令的工作原理&#xff0c;甚至可以执行一些管理任务。 走进Linux的/proc目录 今天&#xff0c;我们将查看/proc目录并熟悉它…

最新版 苹果 IOS AppStore证书申请全流程 包括p12文件

第一步 登陆开发者网站并进入证书管理页。 辅助工具网站地址&#xff1a;http://www.applicationloader.net/ 第二步 添加【Certificates】证书。在这里插入图片描述 第三步 进入添加页后&#xff0c;根据需求选择。 第四步 选择好环境之后&#xff0c;这里需要选择一个…

GitHub上传本地程序操作的问题解决汇总

1、新建远程仓库 2、提交本地程序到GitHub 完整命令汇总&#xff0c;这些命令的顺序已解决目前Git提交所遇到的下面问题 存在的问题展示部分没贴出来&#xff0c;可以先按命令顺序走一遍流程。 git init //把这个目录变成Git可以管理的仓库git checkout -b main //切换至main默…

如何零基础自学 Python ?听我娓娓道来

如何零基础自学 Python &#xff1f; 前言 今天这篇文章是对初学者的一篇学习资料分享与总结&#xff01; 简单介绍下笔者的自学之路 起初学习 Python 是在 2020 年&#xff0c;那时临近毕业&#xff0c;由于面临着找工作的不确定性&#xff0c;便学习了相关的网络安全知识&…

计组作业笔记【 总线 】

系统总线按传输内容不同分为数据总线&#xff0c;地址总线&#xff0c;控制总线。 片内总线与系统总线是并列关系&#xff0c;与通信总线一同作为总线按功能的分类。 所以选B 总线复用是指一种信号线在不同时间传输不同的信息。 所以该题选A。 当某设备正获得了总线控制权时…

系统安装技能测试

系统安装技能测试 目录 系统安装技能测试 一、制作PE U盘 安装完成之后查看U盘是否有PE 使用制作好的U盘进入PE界面 二、使用虚拟机进入PE界面 虚拟机成功进入PE主界面 三、PE界面进行分区操作 在PE模式下&#xff0c;使用ISO进行系统安装 四、PE系统备份 五、使用PXE进行网克…

Springboot毕业设计毕设作品,微信校园疫情防控小程序设计与实现

功能清单 【后台管理员功能】 关于我们设置&#xff1a;设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信…

基于51单片机GPS定位系统设LCD12864显示(程序+原理图+PCB+论文)

资料编号&#xff1a;202 功能介绍&#xff1a; (1).定位功能 GPS通过接收卫星信号&#xff0c;可以准确地定出其所在的位置&#xff0c;位置误差小于10米。利用GPS&#xff0c;在12864上面显示当前位置。 (2).查询时间功能 GPS还可以接收卫星发下来的时间信息&#xff0c;…

【openEuler系列】配置本地yum源

个人名片&#xff1a; 对人间的热爱与歌颂&#xff0c;可抵岁月冗长&#x1f31e; Github&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff1a;念舒_C.ying CSDN主页✏️&#xff1a;念舒_C.ying 个人博客&#x1f30f; &#xff1a;念舒_C.ying 【openEuler系列】配置本地y…

漏洞深度分析|Apache Fineract 远程代码执行漏洞

项目介绍 Apache Fineract 是一个开源的系统&#xff0c;用于核心银行系统平台化建设。为创业者、金融机构和服务提供商提供了一个可靠、健壮的、可负担得起的金融服务解决方案。 项目地址 https://github.com/apache/fineract 漏洞概述 Apache Fineract 在 1.8.1 之前的版…

NR DCI Format介绍

NR DCI(下行控制信息)与LTE中的DCI类似&#xff0c;均是承载上/下行数据信道的调度信息&#xff08;如PDSCH/PUSCH&#xff09;。 如下表&#xff0c;摘自38212 7.3.1节。其中0-0/0-1承载上行数据信道PUSCH的调度信息。1-0/1-1承载下行数据信道PDSCH的调度信息&#xff0c;加扰…

QT断点调试[通俗易懂]

QT设置断点调试&#xff1a; 1、知道哪里可能出问题2、完全不清楚自己程序bug在哪3、跳过肯定不会出错的地方 前言&#xff1a; 这个东西难道大家不都应该会吗??? 本人用Qt Creator编写Qt的&#xff0c;~ 当然是有大佬用记事本写Qt的hhhh&#xff0c;每个人用IDE或者编辑器…

Python中__init__.py的作用介绍

一、文件__init__.py作用&#xff1a;package / module 的标志 下图的serrors包含这个文件时候&#xff0c;Python会将其当做一个模块&#xff08;module&#xff09;来处理&#xff0c;进而可以使用from serrors import xx方式导入serrors包中的文件或模块。 如图所示&#x…

Linux的IO(初阶)

Linux的IO(初阶) 文章目录Linux的IO(初阶)1.C语言文件IO1.1 C语言文件的(复习)1.2 相对路径与绝对路径(复习)1.3 C语言中文件操作函数(复习)1.4 C语言文件写入方式(复习)1.5 三个默认打开的流1.6 FILE类型的理解2.Linux系统文件IO2.1 打开文件的系统接口函数&#xff1a;open2.…