Spring5学习笔记

Spring5

  • 框架概述
  • IOC(Inversion Of Control)
    • IOC基本过程:
    • IOC接口(BeanFactory)
      • IOC接口实现类
    • IOC操作Bean管理
      • 一、什么是Bean管理?
      • 二、什么是DI?
      • 三、Bean管理的两种实现方式
        • 1.基于XML配置文件方式实现
          • 基于XML方式创建对象
          • 基于XML方式注入属性
            • 常规属性注入
            • 特殊属性值的注入
        • 2.基于注解方式实现
          • 什么是注解?
          • 基于注解方式创建对象
            • 有关创建对象提供的注解(默认都是单例)
          • 基于注解方式注入属性
            • 有关 对象属性注入 的注解
            • 示例
          • 实现完全注解开发(无XML配置文件)
      • 四、Bean管理的作用域
        • 如何设置Spring创建Bean是单实例还是多实例?
        • 区别
      • 五、Bean管理的生命周期
        • Spring中Bean生命周期的基本流程(未添加后置处理器)
          • 演示
        • Spring中Bean生命周期的基本流程(添加后置处理器)
          • 演示
      • 六、Bean管理之XML自动装配
      • 七、Bean管理之引入外部属性文件
  • AOP(Aspect Oriented Programming)
    • 概念
    • AOP术语
      • 连接点
      • 切入点
      • 通知(增强)
        • 切面
    • AOP底层原理
      • 动态代理
        • 有接口(JDK动态代理)
          • 演示实现过程
        • 无接口(CGLIB动态代理)
    • AOP操作
      • 基于AspectJ实现AOP操作
        • 通过XML配置文件方式实现
          • 基本步骤
        • 通过AspectJ注解方式实现
          • 基本步骤
          • 示例
          • 常用操作
  • JDBCTemplate
    • JDBCTemplate基本使用流程
    • JDBCTemplate基本CRUD操作
      • CREATE 增
      • READ 查
      • UPDATE 改
      • DELETE 删
  • Spring 事务操作
    • 事务概念
      • 事务使用基本流程
    • Spring 事务管理
      • Spring 事务管理 API
      • 编程式事务管理
      • 声明式事务管理(常用)
        • 参数配置
        • 基于注解方式(常用)
        • 基于 xml 配置文件方式
        • 示例:完全注解实现Spring声明式事务管理
  • Spring 配置文件常见XML标签
    • Bean标签
      • Property标签
        • Value标签
        • list标签
          • Value标签
          • ref标签
        • Array标签
          • Value标签
        • Map标签
          • Entry标签
        • Set标签
          • Value标签
  • Spring5 新功能
    • Spring5 框架整合 Log4j2
    • Spring5 框架整合 JUnit4
    • Spring5 框架整合 JUnit5

Spring5代码学习仓库:Gitee
视频课程:尚硅谷2022 Spring5教程
Spring5新特性
https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md
https://zhuanlan.zhihu.com/p/645200006

框架概述

Spring 是轻量级的开源的 JavaEE 框架。Spring 可以解决企业应用开发的复杂性。
Spring 有两个核心部分:IOC 和 Aop
(1)IOC:控制反转,把创建对象过程交给 Spring 进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
Spring 特点
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度

IOC(Inversion Of Control)

把对象创建和对象之间的调用过程,交给 Spring 进行管理。

目的:为了降低开发中的耦合度。
基本实现原理:XML解析、工厂模式、反射。

附:工厂模式详解

IOC基本过程:

  1. xml配置文件,配置要创建的对象Bean。
  2. xml解析得到配置文件中的包路径。
  3. 创建XXFactory工厂类,通过反射创建对象返回。

IOC接口(BeanFactory)

IOC的思想就是基于IOC容器完成,IOC的底层就是对象工厂。
Spring提供了两个IOC容器实现的方式(两个接口)。

  • BeanFactory:IOC容器的基本实现,一般是Spring内部使用,不建议开发人员使用。
    • 在加载配置文件时不会创建容器中的对象,只有获取时才创建
  • ApplicationContext:BeanFactory的子接口,提供更多更强大的功能。一般由开发人员使用。
    • 在加载配置文件时会同时创建容器中的对象

注:推荐使用ApplicationContext接口,因为项目使用中,一般把耗时的操作放在项目启动时。

IOC接口实现类

在这里插入图片描述

IOC操作Bean管理

Spring中有两种类型的Bean:普通Bean(开发者自己创建)工厂Bean(FactoryBean)
主要区别

  • 普通Bean:在配置文件中定义的Bean类型(class中指定)就是获取bean得到的类型。
  • 工厂Bean:在配置文件中定义的Bean类型(class中指定)可以和获取bean类型不一致。

怎么手动创建工厂Bean?

  1. 创建类,实现FactoryBean接口
  2. 实现接口中的方法,在实现的getObject方法中可以定义不同的返回Bean类型
public class MyBean implements FactoryBean<Department> {@Overridepublic Department getObject() throws Exception {// 自定义返回类型Department department = new Department();department.setDeptName("研发部");return department;}@Overridepublic Class<?> getObjectType() {return null;}@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}

一、什么是Bean管理?

Bean管理指两个操作:

  • 由Spring创建对象
  • 由Spring注入属性。

二、什么是DI?

DI(Dependency Injection)依赖注入,IOC的具体实现,简单来说就是注入属性,需要在创建对象完成的基础之前来进行

三、Bean管理的两种实现方式

1.基于XML配置文件方式实现
基于XML方式创建对象

在配置文件的beans标间中新建bean标签,填写id、class等属性。
:如果没有设置构造参数子标签(<constructor-arg></constructor-arg>),则默认使用无参构造方法创建,因此需要注意无参构造是否存在。

基于XML方式注入属性
常规属性注入
  • 使用set方法注入(默认使用无参构造创建bean
    1. 在实体类中创建好对应属性的set方法
    2. 在Spring配置文件中的Bean标签中插入属性标签<property name="property" value="value"></property>
  • 使用有参构造方法注入(根据参数匹配构造方法创建bean
    1. 在实体类中创建好对应属性的 有参构造方法
    2. 在Spring配置文件中的Bean标签中插入构造方法参数标签<constructor-arg name="property" value="value"></constructor-arg><constructor-arg index=“Number” value="value"></constructor-arg>
      • name:构造方法中参数的属性名
      • value:注入的实际值
      • index: 索引,从0开始,代表构造方法从左至右的参数。
      • 注:相较于标签的两种写法,使用name方式更准确。
  • P名称空间注入(用于简化XML配置方式)
    1. 在XML配置文件中的beans标签上添加xmlns:p="http://www.springframework.org/schema/p"命名空间
    2. 进行属性注入,在bean标签中操作。
      • 无需再写子标签,直接在bean书写p:注入属性名即可完成操作。
      • 注意 : 仅简化set方式注入

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"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置User对象创建:默认使用无参构造方法 --><bean id="my_user" class="icu.lking.spring5.User"></bean><!-- 方式一:使用set方法完成依赖注入 --><!-- 配置Book对象创建信息:默认使用无参构造方法 --><bean id="book_di_property" class="icu.lking.spring5.Book"><property name="bookName" value="小红与小牛的故事"></property><property name="author" value="Jason"></property></bean><!-- 方式二:使用构造方法方法完成依赖注入 --><!-- 配置Book对象创建信息:这里使用有参构造方法 --><bean id="book_di_constructor_name" class="icu.lking.spring5.Book"><!-- 使用name方式 --><constructor-arg name="author" value="Jason"></constructor-arg><constructor-arg name="bookName" value="放牛娃的夏天"></constructor-arg></bean><bean id="book_di_constructor_index" class="icu.lking.spring5.Book"><!-- 使用Index方式 --><constructor-arg index="0" value="小白和小黑"></constructor-arg><constructor-arg index="1" value="Jason"></constructor-arg></bean><!-- 方式三:使用p命名空间注入属性  注意 : 仅简化set方式注入 --><bean id="order_di_p_label" class="icu.lking.spring5.Order" p:orderNumber="123456" p:createUserName="Jason"></bean>
</beans>
特殊属性值的注入

字面量:设置的固定值都是字面量。

  1. null值
    主要是null标签的使用。
<!-- 注入特殊值,null值 --><bean id="student_di_null" class="icu.lking.spring5.Student"><property name="name" value="Jason"></property><property name="stuNumber"><!-- null值标签 --><null/></property></bean>
  1. 属性值包含特殊符号
    主要问题:使用特殊符号中要避免xml进行转义。
    解决方式
    ①.特殊符号使用转义字符,如>&gt;表示
    ②.使用<![CDATA[...]]>标记,可以忽略xml的转义(在该标签中的语句和字符原本是什么样的,在拼接成SQL后还是什么样的)
 <!-- 注入特殊值,包含特殊符号的属性值 --><!-- 主要是要避免xml进行转义 --><!-- 1.特殊符号使用转义字符,如>用&gt;表示 --><!-- 2.使用<![CDATA[...]]>标记,可以忽略xml的转义(在该标签中的语句和字符原本是什么样的,在拼接成SQL后还是什么样的) --><bean id="student_di_split_label" class="icu.lking.spring5.Student"><!-- 拆分属性标签写法 --><property name="name"><value>Jason&lt;CEO&gt;</value></property><property name="stuNumber"><value><![CDATA[<<20210907>>]]></value></property></bean>
  1. 注入外部Bean属性
    使用property标签的ref属性来注入外部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"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 外部Bean注入 --><!-- UserService Bean,采用Set注入方式注入UserDao --><bean id="userService" class="icu.lking.spring5.service.UserService"><!-- Set注入  ref:填写外部Bean ID--><property name="userDao" ref="userDao"></property></bean><!-- UserDao Bean :寻找其实现类创建Bean--><bean id="userDao" class="icu.lking.spring5.dao.impl.UserDaoImpl"></bean><!-- 测试User --><bean id="testUser" class="icu.lking.spring5.User" p:name="Jason" p:sex="male"></bean>
</beans>
  1. 注入内部Bean属性和级联赋值
    • 注入内部Bean
      注入内部Bean,即在Property标签下嵌套Bean标签实现。
    • 级联赋值
      级联赋值即 在不嵌套bean标签的情况下,便可完成对内部bean的内部属性赋值。
      实现方式
      采用外部bean的方式注入,即可不嵌套bean标签。采用.符号则可可同时对外部bean的属性赋值,无需嵌套bean标签。(需要有get方法
<?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"><!-- 注入 内部Bean 属性 --><!-- 员工Bean --><bean id="testEmp" class="icu.lking.spring5.bean.Employee"><!-- set注入 普通属性 : 两种写法,效果相同 --><property name="name" value="Jason"></property><property name="workNumber"><value>20210907</value></property><!-- 注入属性 内部Bean --><property name="department"><!-- 内部Bean 可以不写 id --><bean id="inner_bean_dept" class="icu.lking.spring5.bean.Department"><property  name="deptName" value="研发部"></property></bean></property></bean><bean id="testEmpAgain" class="icu.lking.spring5.bean.Employee"><!-- set注入 普通属性 --><property name="name" value="Jack"></property><property name="workNumber" value="20210906"></property><!-- 注入属性 内部Bean --><!-- 级联赋值: 可以通过外部bean 方式 并搭配 级联符号 --><property name="department" ref="dept"></property><!-- 如果使用级联符号 必须 注意:需要在Employee类中提供该属性的get方法,才能使用 --><property name="department.deptName" value="安保部"></property></bean><bean id="dept" class="icu.lking.spring5.bean.Department"></bean>
</beans>
  1. 注入数组/List集合/Map集合/Set集合类型属性值
    • 在使用基本数据类型与包装类和String类型作为元素情况下
      property下写出对应属性的标签即可。
    • 在使用对象作为元素的情况下
      提前创建对应数目的元素bean,在property下写出对应属性的标签,并在对应标签下添加对应元素bean数目的ref标签,在ref标签的bean属性中填写 元素bean的id。
    • 数组/List集合/Map集合/Set集合类型属性值的 提取 (重复使用)
      1. 添加util命名空间
        • xmlns:util="http://www.springframework.org/schema/util"
        • 同时在xsi:schemaLocation="...”中追加http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
      2. 创建公共引用部分集合,定义id
      3. 注入属性时,使用property标签的ref属性引用公共集合部分
package icu.lking.spring5.collectiontype;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** 测试 注入*/
public class CollectionTestBean {// -------在使用基本数据类型与包装类和String类型作为 元素 情况下--------// 1. 数组类型属性private String[] arr;// 2. List集合类型属性private List<String> list;// 3. Map集合类型属性private Map<String, String> map;// 4. Set集合类型属性private Set<String> set;// ----公共集合共用----private List<String> list1;private List<String> list2;// -----在使用对象作为 元素 的情况下------private List<Course> courseList;public void setCourseList(List<Course> courseList) {this.courseList = courseList;}public void setArr(String[] arr) {this.arr = arr;}public void setList1(List<String> list1) {this.list1 = list1;}public void setList2(List<String> list2) {this.list2 = list2;}public void setList(List<String> list) {this.list = list;}public void setMap(Map<String, String> map) {this.map = map;}public void setSet(Set<String> set) {this.set = set;}/*** 重写 toString 展示数据* @return*/@Overridepublic String toString() {return "CollectionTestBean{" +"arr=" + Arrays.toString(arr) +", list=" + list +", map=" + map +", set=" + set +", list1=" + list1 +", list2=" + list2 +", courseList=" + courseList +'}';}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"><!-- 公共部分list --><util:list id="global_list"><value>123</value><value>456</value><value>789</value></util:list><bean id="testCollectionType" class="icu.lking.spring5.collectiontype.CollectionTestBean"><!-- 在使用基本数据类型与包装类和String类型作为 元素 情况下 --><!-- 1. 注入 数组属性值 --><property name="arr"><!-- 这里采用array标签或list标签都可 --><array><value></value><value></value><value></value></array></property><!-- 2. 注入 List集合属性值 --><property name="list"><list><value></value><value></value

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

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

相关文章

pcl+vtk(十四)vtkCamera相机简单介绍

一、vtkCamera相机 人眼相当于三维场景下的相机&#xff0c; VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕、图像等。 相机位置&#xff1a;即相机所在的位置&#xff0c;用方法vtkCamera::SetPosition()设置。 相…

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09; 水仙花数是指一个 3 位数&a…

x-cmd pkg | sqlite3 - 轻量级的嵌入式关系型数据库

目录 简介首次用户 技术特点竞品和相关产品sqlite 与 x-cmd进一步阅读 简介 sqlite3 是一个轻量级的文件数据库&#xff0c;体积非常小&#xff0c;提供简单优雅而功能强大的 sql 化的数据查询。 通常情况下&#xff0c;sqlite 指的是 SQLite 2.x 版本&#xff0c;而 sqlite3 …

【K8S 云原生】K8S的安全机制

目录 一、K8S安全机制概述 1、概念 2、请求apiserver资源的三个步骤&#xff1a; 一、认证&#xff1a;Anthentcation 1、认证的方式&#xff1a; 1、HTTP TOKEN&#xff1a; 2、http base&#xff1a; 3、http证书&#xff1a; 2、认证的访问类型&#xff1a; 3、签发…

网络安全B模块(笔记详解)- Linux操作系统渗透提权

1. 使用渗透机对服务器信息收集,并将服务器中SSH服务端口号作为flag提交; 2. 使用渗透机对服务器信息收集,并将服务器中主机名称作为flag提交; 3. 使用渗透机对服务器信息收集,并将服务器中系统内核版本作为flag提交; 4. 使用渗透机对服务器管理员提权,并将服务器中r…

C# 使用AutoMapper实现类映射

写在前面 AutoMapper是一个用于.NET中简化类之间的映射的扩展库&#xff1b;可以在执行对象映射的过程&#xff0c;省去的繁琐转换代码&#xff0c;实现了对DTO的快速装配&#xff0c;有效的减少了代码量。 通过NuGet安装&#xff0c;AutoMapper&#xff0c; 由于本例用到了D…

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同&#xff0c;WPF 具有许多支持双向内容快速开发的功能&#xff0c;例如&#xff0c;同一文档中混合了从左到右和从右到左的数据。 同时&#xff0c;WPF 也为需要双向功…

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备2

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;4&#xff09;—— virtio所创建的设备1 在上一篇文章中&#xff0c;对于面试所提出的问题“virtio会创建哪些设备&#xff1f;”&#xff0c;有了初步答案&#xff0c;即…

单调性的应用

1单调性 应用场景&#xff1a;常应用于双指针的进一步优化问题中含义&#xff1a;针对指针 i 1 > i i1>i i1>i一定有 j 1 > j j1>j j1>j或者 j 1 < j j1<j j1<j这样我们就可以利用该性质对算法进行进一步优化&#xff0c;避免一些不必要的遍历…

微软人工智能办公AI工具 Copilot Pro 11项 Copilot 功能

Copilot&#xff08;曾用名 Bing Chat 和 Bing Chat Enterprise&#xff09;在此期间成为了许多用户的日常AI伴侣&#xff0c;并在正式发布后将继续为用户提供AI驱动的网络聊天体验。 微软Copilot官方网址链接&#xff1a;Microsoft Copilot: 你的日常 AI 助手 Copilot详情&am…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

Rollup:打包 TypeScript - React 组件库

调用浏览器摄像头拍照组件 1、前提1、安装依赖2、添加 rollup.config.js 配置3、修改 package.json3.1 添加打包命令3.2 添加组件入口3.3 添加组件声明入口3.4 浏览器支持 1、前提 1.1 通过 create-react-app take-photo --template 创建前端应用 1.2 添加组件 TakePhoto (拍照…

3 - 主从复制结构|持久化|数据类型

主从复制结构&#xff5c;持久化&#xff5c;数据类型 主从复制 没有高可用功能命令行配置修改配置文件&#xff08;永久有效&#xff0c;重启了redis服务依然有效&#xff09; 配置带验证的主从复制主从从配置哨兵服务&#xff08;可实现高可用&#xff09;持久化RDB文件的使用…

幻兽帕鲁服务器多少钱一个?32元你敢信吗?4核16G

幻兽帕鲁服务器多少钱&#xff1f;价格便宜&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;4核32G配置113元1个月、339元3个月&#xff1b;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

LEETCODE 164破解闯关密码

class Solution { public:string crackPassword(vector<int>& password) { //在比较两个字符串大小时&#xff0c;其实是按照字典序逐个比较它们的字符。首先比较两个字符串的第一个字符&#xff0c;如果它们不相等&#xff0c;则可以根据它们的 ASCII 码大小确定它们…

opencv012 滤波器04 中值滤波,双边滤波

中值滤波 取中位数&#xff0c;可以处理椒盐噪音 CV自带medianBlur函数dst cv2.medianBlur(src, ksize) 参数说明&#xff1a;1.src: 需要滤波的图片&#xff1b;2.ksize&#xff1a;核大小&#xff0c;必须是比1大的奇数【举个例子&#xff1a;3&#xff0c;5&#xff0c;7……

RISC-V RVWMO 内存模型解释

RISC-V RVWMO 内存模型解释 引言 本文介绍 RISC-V RVWMO 内存模型。RVWMO 内存模型定义了什么样的全局内存顺序才是合法的。本引言部分将解释为什么会出现不合法的全局内存顺序&#xff0c;以及为什么需要内存模型。 首先引起乱序的全局内存顺序&#xff08;指令重排序&…

10.多柱状图(MuliBarChart)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 话接上回&#xff08;9.单柱状图&#xff08;SingleBarChart&#xff09;&#xff09;&#xff0c;从单柱拓展到多柱状图。 1.数据设置 private void InitValue(List<BasicSerieDto> dtos){Serie…

14.5 Flash查询和添加数据库数据

14.5 Flash查询和添加数据库数据 在Flash与数据库通讯的实际应用中&#xff0c;如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程&#xff0c;而注册则是ASP将Flash提供的数据写入数据库的过程。 1.启动Access2003&…