黑马程序员SSM框架教程_Spring+SpringMVC+MyBatisPlus笔记(自学用,持续更新)
创始人
2024-05-11 19:25:29
0

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的基础配置,

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

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

  • singleton默认为单例
  • prototype为非单例

	//spring报错信息处理,看最后一个报错信息,这个解决了报错也就差不多可以解决,看不懂再看倒数第二个以此类推。

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

bean的实例化

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

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



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

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


在这里插入图片描述

训练中的不足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标签注入
例如:其中ref的值是bean的id,name的值是引用类的对象名。

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

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

  • 对于引用数据类型使用的是
  • 对于简单数据类型使用的是

构造器注入

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

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

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

小结

  • setter注入

    • 简单数据类型

      
      
      
    • 引用数据类型

      
      
      
  • 构造器注入

    • 简单数据类型

      
      
      
    • 引用数据类型

      
      
      
  • 依赖注入的方式选择上

    • 建议使用setter注入
    • 第三方技术根据情况选择

自动注入

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

如:

  

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

集合注入

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

100200300100200300itcastitheimaboxueguboxuegu

说明:

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

Spring_day02

对象有我们自己的IOC帮忙创建的,还有第三方提供的,如何管理这些第三方提供的bean呢?

以Spring的IOC容器来管理Druid连接池对象为例:

1.使用第三方的技术,需要在pom.xml添加依赖

2.在配置文件中将【第三方的类】制作成一个bean,让IOC容器进行管理

3.数据库连接需要基础的四要素驱动连接用户名密码,【如何注入】到对应的bean中(driver,url,username,password)

4.从IOC容器中获取对应的bean对象,将其打印到控制台查看结果。

对于一个陌生的第三方的bean,我们就要探索了,在mvnresportry搜索,然后看他是否可以用构造方法注入,如若不行则用setter方法注入,使用setter方法注入则在配置文件中用property和value标签配置就可。

黑马举两个数据连接池的例子,druid和C3p0

修改五个地方:
在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...