小小白的SSM学习笔记——Spring5学习

2024-03-07 01:30

本文主要是介绍小小白的SSM学习笔记——Spring5学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 学习笔记仅为个人学习记录,如有错误望各位大佬不吝赐教!学习视频资源:[遇见狂神说](https://space.bilibili.com/95256449?from=search&seid=5212369959759283056)
  • Spring5
    • 一、了解历史
      • 1.1发展
      • 1.2What is Spring?
      • 1.3什么是最少侵入?
        • 侵入式:
        • 非侵入式
        • 非侵入式的技术体现
        • 如何实现非侵入式
      • 1.4、SSH和SSM
      • 1.5、Spring的优点
      • 1.6、Spring的组成和扩展
    • 二、IOC理论
    • 三、HelloSpring
    • 四、IoC创建对象的方式
      • 1、使用对象的无参构造创建对象(默认)(**没有无参构造会报错**)
      • 2、使用有参构造
    • 五、Spring配置
      • 1、Alias
      • 2、Bean
      • 3、import
    • 六、依赖注入
      • 为什么要使用依赖注入
      • 6.1、构造器注入
      • 6.2、Set方式注入(重点)
        • 普通属性
        • 数组
        • List
        • Set
        • Map
        • Properties
        • 引用类型
        • Null
      • 6.3、扩展方式注入
      • 6.4、Bean的作用域(Scope)
        • 1. 单例(Singleton)
        • 2. 原型(prototype)
    • 七、自动装配(Autowire)
      • 7.1、byName自动装配
      • 7.2、byType自动装配
      • 7.3、使用注解自动装配
        • 小知识
    • 八、使用注解开发
      • 8.1、bean
      • 8.2、属性注入
      • 8.3、衍生注解
      • 8.4、自动装配注解
      • 8.5、作用域
    • 九、完全使用Java配置(JavaConfig)
      • 9.1、使用JavaConfig创建bean
    • 九、【新增】xml、注解和Java Config到底选哪个
    • 十、AOP
      • 定义:什么是AOP
      • 问题:为什么要使用AOP
      • AOP术语
      • AOP常用场景
      • ==**五种类型的Advice**==
    • 十一、spring实现AOP
      • 方式一:使用Spring的API接口
      • 方式二:自定义类【切面定义】
      • 方式三:使用注解实现
    • 十二、整合Mybatis
      • 12.1、回忆Mybatis
      • 12.2、整合Mybatis
        • 方式一
        • 方式二
    • 十三、声明式事务
      • 回顾事务:
      • ACID原则:
      • Spring管理事务的方式
      • 使用Spring管理事务
        • 结合AOP实现事务的织入
      • ACID原则:
      • Spring管理事务的方式
      • 使用Spring管理事务
        • 结合AOP实现事务的织入

学习笔记仅为个人学习记录,如有错误望各位大佬不吝赐教!学习视频资源:遇见狂神说

Spring5

image-20200329214859171

一、了解历史

Java?Spring?春天?他们之间到底有怎样的联系?

  • spring的缔造者Rod Johnson
  • 一本名为Expert one-on-one J2EE Development without EJB的书
  • 关于EJB(Enterprise Java Beans)又被称为 “企业Java Beans”

关于Spring的发展起源要回溯到2002年,当时正是Java EE和EJB大行其道的时候,很多知名公司都是采用此技术方案进行项目开发。这时候有一个小伙子认为 EJB 太过臃肿,并不是所有的项目都需要使用 EJB 这种大型框架,应该会有一种更好的方案来解决这个问题。

他提出了一个基于普通 Java 类(POJO)和依赖注入的更简单的解决方案。

他展示了如何在不使用 EJB 的情况下构建高质量、可扩展的在线座位预留系统。为了构建应用程序,他编写了超过 30,000 行的基础结构代码,项目中的根包命名为 com.interface21,所以人们最初称这套开源框架为 interface21,这就是 Spring 的前身。

**“轮子理论”,也即“不要重复发明轮子”,这是西方国家的一句谚语,原话是:Don’t Reinvent the Wheel。**Spring就是在“不重复发明轮子”的理念及指导原则上做起来。

1.1发展

2003 年 Rod Johnson 和同伴在此框架的基础上开发了一个全新的框架命名为 Spring,据 Rod Johnson 介绍 Spring 是传统 J2EE 新的开始,随后 Spring 发展进入快车道。

  • 2004 年 03 月,1.0 版发布。
  • 2006 年 10 月,2.0 版发布。
  • 2007 年 11 月,更名为 SpringSource,同时发布了 Spring 2.5。
  • 2009 年 12 月,Spring 3.0 发布。
  • 2012年 Rod Johnson宣布离开Spring
  • 2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。
  • 2017 年 09 月,Spring 5.0 发布。

1.2What is Spring?

通常, Spring 是指一个用于构造 JAVA 应用程序的轻量级框架

  1. 你可以采用 Spring 来构造任何程序
  2. Spring 是轻量级的,意味着你只需对你的程序代码做很少改动。(最少的侵入)
  3. Spring 核心本身——很多附加的 Spring 组件,比如数据访问,需要与 Spring 框架有相对紧密得多的耦合关系。

1.3什么是最少侵入?

侵入式:

侵入式的做法是要求业务代码”知道”框架的代码,表现为业务代码需要继承框架提供的类,才能很好的和框架结合,使用框架带来的便利。

侵入式让业务代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。

但是,可以使用户和框架更好的结合,更容易更充分的利用框架提供的功能

非侵入式

非侵入式则不需要业务代码引入框架代码的信息,即无需继承框架提供的类,从编写者的角度来看,察觉不到框架的存在。

可以很方便的迁移到其他地方使用,代码的复用性较好。

但是框架和业务代码互动的方式可能就比较复杂

非侵入式的技术体现

允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须继承或实现Spring框架的类和接口来达到使用框架的目的。

如何实现非侵入式
  1. 引用==反射机制==,通过动态调用的方式来提供各方面的功能,建立核心组件BeanFactory
  2. 配合使用Spring框架中的==BeanWrapper和BeanFactory组件类==最终达到对象的实例创建属性注入

1.4、SSH和SSM

SSH:Structs + Spring + Hibernate

SSM:SpringMVC + Spring + MyBatis

1.5、Spring的优点

  1. Spring是一个开源的免费的框架(容器)
  2. Spring是一个轻量级的、非入侵式的框架
  3. 控制反转(IOC)、面向切面编程(AOP)
  4. 支持事务的处理,对框架整合的支持

1.6、Spring的组成和扩展

  • 七大模块:

img

  • SpringBoot
    • 一个快速开发的脚手架
    • 基于SpringBoot可以快速地开发单个微服务
  • SpringCloud
    • 基于SpringBoot实现

二、IOC理论

IOC:(Inversion of Control)控制反转

传统开发,我们需要对于客户的不同需求修改代码创建不同的对象,对象的创建由开发者控制,而新模式的开发,应该是由调用者去决定对象的创建,且不影响源代码。

使用了set注入后,程序的所有对象由Spring为我们注入,开发人员只需搭建好框架,写好配置文件即可。

系统的耦合性降低,(松耦合) 更加专注于业务的开发。

控制反转主动权由程序员转换到用户

由于是"获得依赖对象的过程被反转了"

**依赖注入(Dependency Injection,DI)**则是控制反转的一种实现,所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

其实IOC也好DI也好都是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦

举例:

对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。

传统的实现中,由程序内部代码来控制组件之间的关系。我们经常使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。

[参考博客]https://blog.csdn.net/love_everybody/article/details/79836136?depth_1-utm_source=distribute.pc_relevant.none-task

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。

三、HelloSpring

  1. 导入官方xml配置(直接创建Spring)

    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="..." class="...">  <!-- collaborators and configuration for this bean go here --></bean><bean id="..." class="..."><!-- collaborators and configuration for this bean go here --></bean><!-- more bean definitions go here --></beans>
    
    The id attribute is a string that identifies the individual bean definition.
    The class attribute defines the type of the bean and uses the fully qualified classname.
  2. 容器中创建对象

    xml配置文件中 使用标签创建对象,标签中使用标签设置属性值,前提是对应的实体类中有相应的 SET 方法。

    <bean id="hello" class="com.sakura.pojo.Hello"><property name="msg" value="Spring"/>
    </bean>
    
    name:对应于当前对象的属性名
    value:设置对应的属性值
    ref:当属性并不是普通类型时,而是引用类型时, 通过ref 指定引用对象的 bean的id
    • ref 和 id 之间的这种联系表达了协作对象之间的依赖关系
  3. 从容器中获取对象

    @Test
    public void helloTest() {// 获取Spring的上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 我们的对象存放在Spring的容器中,使用时取出即可Hello bean = (Hello) context.getBean("hello");System.out.println(bean);}
    }
    

    Spring的Resource,它提供了一种从 URI 语法中定义的位置读取 InputStream 的便捷机制。

    image-20200329102629616

    ClassPathXmlApplicationContext只是ApplicationContext接口众多实现类的一种,因为此处我们使用xml配置文件,所以使用CPX,而当我们使用注解配置时,又需要用到另一个实现类AnnotationConfigApplicationContext

到这我们再去修改传统开发的代码:

第一版

public class UserServiceImp implements UserService {//  SqlDao sqlDao = new MysqlImp();SqlDao sqlDao = new OracleImp();/** 以上传统的方式需要我们通过用户的需求,频繁修改代码。*/@Overridepublic void getSqlResource() {sqlDao.getSql();}
}

当我们想要使用同一个接口的不同实现类的方法时,就需要频繁改变组合的对象(使用哪个new哪个)。。为了避免这种情况,我们可以只组合好相应的接口,增加Set方法,由调用者来决定使用哪个实现类

第二版

private SqlDao sqlDao;

public class UserServiceImp implements UserService {/** 以下使用Set方法实现控制反转*/// 组合接口private SqlDao sqlDao;// set方法控制 具体实现类public void setSqlDao(SqlDao sqlDao) {this.sqlDao = sqlDao;}@Overridepublic void getSqlResource() {sqlDao.getSql();}
}

修改后,业务代码无需变更,调用者通过Set方法来指定具体的实现类 即可,依赖的获取过程从开发人员创建对象,转换为 用户自定义选择,IoC的本质就是如此,进一步修改,使用SpringIoC容器

第三版

<bean id="mysql" class="com.sakura.dao.MysqlImp"/>
<bean id="oracle" class="com.sakura.dao.OracleImp"/>
<bean id="sqlserver" class="com.sakura.dao.SqlServerImp"/><bean id="sqlService" class="com.sakura.service.UserServiceImp"><property name=&#

这篇关于小小白的SSM学习笔记——Spring5学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782017

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows