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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La