本文为基于 狂神说Java 及 黑马视频 的 Spring 的学习笔记,附自己的学习理解,欢迎小伙伴们一起讨论(未更完)。
Spring 是一个轻量级控制反转(IoC)和 面向切面(AOP)的容器框架
【注】既然是一个容器,那么它内部存储的是对象
Spring 官网:https://spring.io/projects/spring-framework#overview
2002年,推出了Spring 框架的雏形:interface 21框架
2004年3月24日,正式发布了1.0版本
创始人:Rod Johnson (挺厉害的音乐学博士、感兴趣的可自行搜索)
简化开发:降低企业级开发的复杂性,使之可以适用于任何的 Java 应用,而不仅仅限于服务器端开发
体现在 IoC(控制反转) 、AOP(面向切面)中的事务管理中
框架整合:高效整合其他技术,提高企业级应用开发
如 MyBatis、Mybatis-plus 等
1、是一个开源、免费的框架(容器),方便地管理和配置应用程序中的组件。
2、轻量级、非入侵时框架、可快速构建应用程序
非入侵式:不会对原来的项目产生影响
3、面向切面编程(AOP):提供 cross-cutting concerns 的功能,如事务管理、安全性等
4、依赖注入(DI):用 DI 实现松耦合,让应用程序更加灵活和可维护
5、集成多种技术:可以与许多其他技术和框架集成,如 ORM 框架、Web 框架等,十分灵活
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现,每个模块的功能如下(也可以直接往下滑看总结的思维导图):
Spring AOP :
通过配置管理特性,Spring AOP 模块将直接面向切面的编程功能,集成到了 Spring 框架中,所以可以很容易的使 Spring 框架管理任何支持 AOP 的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
Spring ORM:
Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring DAO:
JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring Web:
Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作
Spring Context:
一个配置文件,向 Spring 框架提供上下文信息,包括企业服务,例如 JNDI 、EJB 、电子邮件、国际化、校验和调度功能。
Spring Web MVC :
MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI
Spring Core :
提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,是工厂模式的实现。beanfactory 使用控制反转 (IOC)模式 将应用程序的配置和以来性规范与实际的应用程序代码分开。
总结如下:
现代化的Java 开发!其实就是基于Spring的开发
- Spring Boot :
① 一个快速开发的脚手架
② 基于SpringBoot 可以快速开发单个微服务
③ 约定大于配置!
- Spring Cloud :
SpringCloud 基于SpringBoot实现的,是一系列框架的有序集合
现在大多数公司都在使用SpringBoot进行快速开发,学习 SpringBoot 的前提,需要完全掌握Spring和SpringMVC
弊端:Spring 发展了太久,融合了很多其他框架,导致配置十分繁琐,“配置地狱”
控制反转IoC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现 IoC 的一种方法。在没有 IoC 的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方(即Spring)
【注】IoC 是 Spring 框架的核心内容,使用多种方式实现了IoC:
① 使用XML配置;② 使用注解;③ 零配置实现。后续将一 一讲解。
思考:
实现:
【注】
bean 标签标示配置 bean
id 属性表示给 bean 起名字
class 属性表示给 bean 定义类型
思考:
实现:
思考:是谁创建的对象?答:set 方法谁调的,就是谁往里面传对象,这里是 Spring 容器
【注】
property 标签表示配置当前 bean 的属性
name 属性表示配置哪一个具体的属性
ref 属性表示参照哪一个 bean
1、使用无参构造创建对象,默认!
2、假设我们要使用有参构造创建对象
① 下标赋值
② 通过类型
③ 通过参数名直接设置
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了
id :new出来的名字,bean的唯一标识符,类似于对象名
class: bean 对象所对应的全限定名 :包名 + 类型
name: 也是别名,比alias更高级,可以同时取多个别名,多个别名之间可以取“, ;”分割
作用范围配置指的是控制bean 创建的时候实例的数量到底是一个还是多个
思考:
不适合交给容器进行管理的bean 有哪些特征呢?
这类对象它其实是叫做有状态的,里面会记录一些它的成员变量的一些属性值
三种实例化方式:
1、bean 的本质上是对象,所以使用构造方法:
【注】无参构造方法如果不存在,将抛出异常 BeanCreationException
2、使用静态工厂造对象(用得少,早些年常用,了解即可)
3、使用实例工厂造对象(了解)
4、对实例工厂的改造(实用),使用 Factory 方法造对象
bean的生命周期:bean 从创建到销毁的整体过程
bean的生命周期控制:在 bean 创建后到销毁前做一些事情
控制生命周期的两种方法:
1、配置 bean 的生命周期:init - method 属性和 destroy - method 的属性
2、使用接口的方式
初始化容器:
1.创建对象(内存分配)
2.执行构造方法
3.执行属性注入( set 操作)
4.执行 bean 初始化方法
使用 bean :
1.执行业务操作
关闭/销毁容器:
1.执行 bean 销毁方法
【bean 的销毁时机】【了解】
容器关闭前触发 bean 的销毁,才能执行 destroy method 的对应方法
关闭容器的两种方式:
1.手工关闭容器:
ConfigurableApplicationContext 接口 close()操作
ctx.close (); //直接关闭容器,更为暴力,只能放在所有操作执行完以后
2. 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机:ConfigurableApplicationContext 接口 registerShutdownHook()操作
ctx.registerShutdownHook(); //可以放在任何位置
依赖:bean 对象的创建依赖于容器
注入:bean 对象中的所有属性由容器来注入
思考:
引用类型:
简单类型:
对上面方法的改进,参数适配:
引用类型:
简单类型:
数组:
List:
Set:
Map:
Properties:
管理第三方传入的 Bean
1、开启 context 命名空间
2、使用context 空间加载 properties 文件
3、使用属性占位符 ${ } 读取 properties 文件中的属性