黑马程序员SSM框架教程_Spring+SpringMVC+MyBatisPlus笔记(自学用,持续更新)

news2025/1/16 1:59:14

Spring的实现有两种方式,一是配置,二是注解

目录

  • Spring_day01
    • IOC、DI
    • Bean的基本配置、实例化、生命周期
      • Bean的基本配置
      • bean的实例化
      • 训练中的不足1:
      • bean的生命周期
    • DI相关内容
      • setter注入
      • 构造器注入
      • 小结
      • 自动注入
      • 集合注入
  • Spring_day02

Spring_day01

IOC、DI

为什么会有IOC和DI?
因为要解决原有代码开发的问题:
在这里插入图片描述
IOC:控制反转,什么控制反转?创建对象的权利由程序反转到程序外部,也就是有IOC容器来创建对象。
DI:依赖注入,其实就是绑定,绑定什么呢?绑定两个有依赖关系的对象。
在这里插入图片描述
IOC和DI的目标和最终效果

在这里插入图片描述

在这里插入图片描述
使用IOC的步骤

    //1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE
    
    //2.配置bean-->
    //bean标签标示配置bean
    //id属性标示给bean起名字
    //class属性表示给bean定义类型
    
    //3.获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
     //4.获取bean(根据bean配置id获取)
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");   强转对象
//        bookDao.save();

这样一套下来,业务层中的代码就可以不new对象了,改为
在这里插入图片描述

在这里插入图片描述
接上面的IOC,实现DI的步骤

//5.删除业务层中使用new的方式创建的dao对象
//6.提供对应的set方法
 
//7.配置server与dao的关系-->
//property标签表示配置当前bean的属性
//name属性表示配置哪一个具体的属性
//ref属性表示参照哪一个bean
 
 

这里的一个对应关系很重要
在这里插入图片描述

Bean的基本配置、实例化、生命周期

Bean的基本配置

对于bean的基础配置,<bean id=" " class=" "/>

IOC容器为我们创建对象默认为单例的,若想创建个多例的,需要在配置文件配置bean的scope属性

使用bean的scope属性可以控制bean的创建是否为单例:

  • singleton默认为单例
  • prototype为非单例
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
	//spring报错信息处理,看最后一个报错信息,这个解决了报错也就差不多可以解决,看不懂再看倒数第二个以此类推。

IOC容器创造bean对象其实是调用了构造方法,并且这个方法不论是公有的还是私有的都可以调得到,因为用到了反射。

bean的实例化

因此bean实例化的第一个方法就是使用构造方法。

以前为了解耦,往往不自己new对象,而是交给工厂new,现在呢,静态工厂可以移交给spring来创建对象,需要配置要创造的bean的工厂方法(factory-method):

<!--方式二:使用静态工厂实例化bean-->
<!--    <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>-->

因此bean实例化的第二个方法就是使用静态工厂。

第三个方法:用FactoryBean创建对象,用UserDaoFactoryBean实现spring框架的一个FactoryBean接口,这是一个泛型,需要指定对象,并重写接口的方法,接着在配置文件中配置

<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

在这里插入图片描述

训练中的不足1:

  • ctx.getBean()不知道要赋值给谁,并且括号里不知道写什么?
  • 重写FactoryBean接口的getObjectType()方法不知道返回一个什么对象?
  • 写完接口总是忘记实现…
  • 好久没写Java,创建对象总是忘记加new…
  • 业务类调用数据类,service调用dao

bean的生命周期

关于是生命周期的核心问题

  • bean生命周期是什么?
    • bean对象从创建到销毁的整体过程。
  • bean生命周期控制是什么?
    • 在bean创建后到销毁前做一些事情。

生命周期的控制主要由两种方是,第一种就是自己写初始化(init)操作和销毁(destory)操作,然后在配置文件中bean标签中添加init-method="初始化方法名" destroy-method="销毁方法名"而运行后发现销毁方法中的内容并不会执行,why?

  • Spring的IOC容器是运行在JVM中
  • 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方法执行
  • main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了
  • 所以没有调用对应的destroy方法

因此解决方法就是:
关闭容器的两种方式:

  • 使用close方法关闭容器,此方法是ClassPathXmlApplicationContext类的,因此要把ApplicationContext换为ClassPathXmlApplicationContext,
  • 注册钩子关闭容器,在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器使用registerShutdownHook()方法,使用此钩子方法也需要把ApplicationContext换为ClassPathXmlApplicationContext

至此就介绍完了,但是这些初始化和销毁实现起来步骤比较多也比较乱,Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-methoddestroy-method,操作:在业务类实现接口时添加两个接口InitializingBeanDisposableBean并实现接口中的两个方法afterPropertiesSetdestroy,例如:

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    public void save() {
        System.out.println("book service save ...");
        bookDao.save(); 
    }
    public void destroy() throws Exception {
        System.out.println("service destroy");
    }
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

DI相关内容

依赖注入的两类方式

  1. setter注入,有两种引用类型和简单类型(基本类型+String)
  2. 构造器注入,同上

setter注入

setter引用类型注入,现在类中注入setter方法,然后在配置文件中使用property标签注入
例如:<property name="bookDao" ref="bookDao"/>其中ref的值是bean的id,name的值是引用类的对象名。

setter简单类型注入,先在类中声明对应的简单数据类型的属性,并提供对应的setter方法,然后在配置文件中使用property标签注入
例如:<property name="connectionNum" value="10"/>其中name的值是声明的数据类型的名称,value是它的值。

对于setter注入方式的基本使用就已经介绍完了,

  • 对于引用数据类型使用的是<property name="" ref=""/>
  • 对于简单数据类型使用的是<property name="" value=""/>

构造器注入

构造器引用数据类型,删除setter方法,添加带有参数的构造方法,然后在配置文件中使用标签<constructor-arg>,例如<constructor-arg name="bookDao" ref="bookDao"/> 其中name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。ref属性指向的是spring的IOC容器中其他bean对象。

构造器简单数据类型,删除setter方法,添加带有参数的构造方法,然后在配置文件中使用标签<constructor-arg>,例如<constructor-arg name="databaseName" value="mysql"/> 其中name属性同上,value是它的值。

其实这俩在配置文件几乎没有差别不过一个property标签,一个是constructor-arg标签
那这两个如何选择呢?自己开发的模板推荐使用setter方法注入。

小结

  • setter注入

    • 简单数据类型

      <bean ...>
      	<property name="" value=""/>
      </bean>
      
    • 引用数据类型

      <bean ...>
      	<property name="" ref=""/>
      </bean>
      
  • 构造器注入

    • 简单数据类型

      <bean ...>
      	<constructor-arg name="" index="" type="" value=""/>
      </bean>
      
    • 引用数据类型

      <bean ...>
      	<constructor-arg name="" index="" type="" ref=""/>
      </bean>
      
  • 依赖注入的方式选择上

    • 建议使用setter注入
    • 第三方技术根据情况选择
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
    
    <!-- bookService依赖bookDao,所以在bookService中配置autowire-->

自动注入

一般采用类型注入(byType),比如bean1依赖bean2,所以我们要在bean1标签的autowire属性中设置为byType,此时bean2甚至都不需要id,IOC就可以帮我们自动注入,当然自动注入只能注入引用类型。
环境:
在这里插入图片描述
BookServiceImpl中要调用BookDao的方法,势必要在BookServiceImpl中声明一个BookDao的对象,并且若实现自动注入,则BookServiceImpl中必须有BookDao的setter方法,再进行配置

如:

  <bean class="com.itheima.dao.impl.BookDaoImpl"/>
  <bean id="bookService" autowire="byType" class="com.itheima.service.impl.BookServiceImpl"/>
<!-- bookService依赖bookDao,所以在bookService中配置autowire-->

注意事项:按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

集合注入

数组、list、set、map、properties一共有五种
先声明集合,然后设置集合的setter方法,接着在配置中用property标记相应的bean,如:

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
                <property name="list">
                    <list>
                        <value>100</value>
                        <value>200</value>
                        <value>300</value>
                    </list>
                </property>
                <property name="array">
                    <array>
                        <value>100</value>
                        <value>200</value>
                        <value>300</value>
                    </array>
                </property>
                <property name="set">
                    <set>
                        <value>itcast</value>
                        <value>itheima</value>
                        <value>boxuegu</value>
                        <value>boxuegu</value>
                    </set>
                </property>
                <property name="map">
                    <map>
                        <entry key="username" value="陈富源"/>
                        <entry key="passWord" value="1234"/>
                    </map>
                </property>
            </bean>

说明:

  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array><list><set><map><props>标签
  • List的底层也是通过数组实现的,所以<list><array>标签是可以混用
  • 集合中要添加引用类型,只需要把<value>标签改成<ref>标签,这种方式用的比较少

Spring_day02

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

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

相关文章

深入理解计算机系统_程序的加载过程和运行过程

这篇博客记录编译得到可执行目标文件后&#xff0c;加载和运行的过程。 编译得到可执行目标文件后&#xff0c;就可以将“可执行目标文件”加载“运行地址”所指的内存位置&#xff0c;然后运行了。下面记录Linux虚拟内存运行的运行过程。 2.1 程序的加载过程 当在windows下双…

【Java AWT 图形界面编程】LayoutManager 布局管理器 ③ ( BorderLayout 布局 )

文章目录一、BorderLayout 布局二、BorderLayout 构造函数 API三、BorderLayout 代码示例1、BorderLayout 基本用法代码示例2、BorderLayout 区域占用代码示例3、BorderLayout 同一区域显示多个组件代码示例一、BorderLayout 布局 BorderLayout 布局 将 Container 容器 分割成 …

深度学习PyTorch 之 DNN-二分类

本节开始说一下DNN分类的pytorch实现&#xff0c;先说一下二分类 流程还是跟前面一样 #mermaid-svg-7Bxg4CYlbKjYOMMf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7Bxg4CYlbKjYOMMf .error-icon{fill:#552222;}…

从校园到职场,听听他们的成长之路

背景介绍 这次分享主题是「从校园到职场 -- 我的成长之路」&#xff0c;视频内容可以查看 B 站链接&#xff1a;从校园到实习再到秋招。 上次的面试分享之后&#xff0c;阿卡拉提到关于刚毕业的学生也会有很多找工作的困扰&#xff0c;而且这个阶段能获取到的信息相对比较有限&…

Java API文档的使用详解

文章目录1. 概念2. 使用Java编程基础教程系列学会使用 API 文档是一个开发者基本的素养&#xff0c;而许多初学者并不会在意 API 文档的使用&#xff0c;甚至从来没有接触过&#xff0c;所以写下这篇文章探讨 API 文档的使用&#xff0c;希望能够帮助到你&#xff0c;先赞后看&…

正点原子嵌入式linux第二期

目录 第5讲 IMX6U芯片介绍 第6讲 6.1汇编LED驱动实验-原理分析 6.2 汇编LED驱动实验-汇编基本语法 ​编辑6.3 驱动编写 6.4 编写驱动 6.5烧写bin文件到SD卡并运行 第七讲 IMX启动方式&#xff08;没怎么听懂&#xff09; 7.1启动设备的选择 7.2 IVT表和BootData详解 7.3D…

从面试官的角度带你从源码分析关于vue(v2.7.10)的面试题

我们在面试的时候经常会被问到vue框架的原理类问题&#xff0c;我今天整理了一些常见问题和答案&#xff0c;希望有不正确之处还请指正。 1.new Vue时发生了什么 首先实例化一个对象&#xff0c;该对象执行init方法初始化生命周期等等&#xff0c;随后执行$mount方法开始生成v…

时间序列模型SCINet(代码解析)

前言 SCINet模型&#xff0c;精度仅次于NLinear的时间序列模型&#xff0c;在ETTh2数据集上单变量预测结果甚至比NLinear模型还要好。在这里还是建议大家去读一读论文&#xff0c;论文写的很规范&#xff0c;很值得学习&#xff0c;论文地址SCINet模型Github项目地址&#xff…

SpringBoot文件上传功能实现、异常处理

目录 一、文件上传 1、页面表单 2、文件上传代码 3、自动配置原理 二、异常处理 错误处理 1、默认规则 2、定制错误处理逻辑 3、异常处理自动配置原理 4、异常处理步骤流程 一、文件上传 1、页面表单 <form method"post" action"/upload" e…

详细实例说明+典型案例实现 对递归法进行全面分析 | C++

第二章 递归法 目录 ●第二章 递归法 ●前言 ●一、递归法是什么&#xff1f; 1.简要介绍 2.生活实例 ●二、递归法的典型案例——阶乘函数&斐波那契数列 1.阶乘函数 2.斐波那契数列 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代码来实现数学…

static关键字的作用

目录 C语言中static关键字的作用 1.static关键字修饰局部变量 2.static关键字修饰全局变量 3.static关键字修饰函数 在C中static关键的作用 1.静态成员变量 2.静态成员函数 C语言中static关键字的作用 1.static关键字修饰局部变量 概念&#xff1a; static修饰局部变量就…

这才是2023年csdn最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

2. 认识O(logN)的排序

1. 递归 递归arr[L…R]范围上求最大值 流程分析如下: java代码: package paixu.class01;public class Code08_GetMax {public static void main(String[] args) {int[] arr {3,2,5,6,7,4};System.out.println(getMax(arr));}public static int getMax(int[] arr) {return p…

浅谈非类型模板参数、模板的特化

非类型模板参数 1.模板参数分类类型形参与非类型形参。 2.类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。类型参数也可以给缺省值 3.非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函…

FARO RevEng Software 22.3.9 Crack

FARO RevEng Software 22.3.9 用于反向工程的三维点云捕捉和网格生成 先进的 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面&#xff0c;以实现反向工程工作流程。然后&#xff0c;工业设计师可以利…

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1 2181 Centos 7 2 node3 192.168.230.130 apache-zookeeper-3.7.1 2181 Centos 7 31. 下载 Apache Downloads 下…

2022简单一年

牙齿软件决定开发的时间是2021年底&#xff0c; 老板说2022年任务是要开发牙齿咬合力的软件&#xff0c; 功能主要借鉴美国的一款软件,老板给了我一份软件的说明书&#xff0c; 包含了软件的所有功能。 看到软件第一感觉是&#xff0c; 做的确实是牛逼&#xff0c; 并且各…

【十 二】Netty 文件传输

概念介绍 文件是最常见的数据源之一&#xff0c;程序经常需要在文件中读取数据&#xff0c;也要将数据保存在文件中&#xff0c;进行持久化。 文件是计算机中一种基本的数据存储形式。即使计算机关机&#xff0c;文件的数据还是存在的&#xff0c;但是内存的数据就会丢失。 相…

联合证券|五定增项目同日被否 保荐机构该不该“背锅”?

一天之内5家上市公司定增一起被拒&#xff0c;这一音讯瞬间引发商场重视。 1月11日&#xff0c;浙江世宝、铭普光磁、胜华新材、日辰股份、振华科技等5家上市公司一起公告称&#xff0c;定增不被证监会受理&#xff0c;理由均是证监会以为请求资料不符合法定方式。 投行业界人…

18.Isaac教程--坐标系

坐标系 本节介绍相机、网格/矩阵/图像和机器人坐标系。 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录坐标系网格像素中心网格/矩阵/图像坐标系相机坐标系机器人坐标系网格像素中心 存储网格 GGG 上的值&#xff0c;使得网格单元将值…