小小白的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

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1