Spring 是一款开源的轻量级 Java 开发框架,目的是提高开发人员的开发效率和系统的可维护性。它是很多模块的集合,使用这些模块可以很方便的让程序员进行高效的开发【比如:IOC 控制反转、AOP 面向切面编程等】
Core Container【Spring 框架的核心模块,主要提供 IOC 依赖注入功能】
AOP
Data Access/Integration
Spring Web
Messaging
是 spring-messaging 是从 Spring 4.0 加入的一个模块,主要负责是为 Spring 框架集成一些基础的报文传送应用
Spring Test
单元测试
Spring、Spring MVC、SpringBoot 之间是什么关系
Spring 包含了多个功能模块,其中最重要的是 Spring-Core 提供了 IOC 依赖注入功能的支持,Spring 中的其它模块比如 Spring MVC 的功能实现都需要依赖于该模块。Spring MVC 主要是赋予了 Spring 快速构架 MVC 架构的 Web 程序的能力。而当使用 Spring 进行开发的时候,各种配置过于麻烦,于是 SpringBoot 就诞生了,SpringBoot 是在简化 Spring 开发
IOC 控制反转是一种设计思想,IOC 的思想就是将原本在程序中手动创建对象的控制权,交给 Spring 框架来管理。控制指的是对象创建的控制权,反转指的是将控制权交给了外部环境。IOC 容器就像是一个工厂,当需要创建一个对象的时候,只需要配置好文件/注解就可以了,不用考虑对象是怎么被创建出来的
Bean 代指的就是那些被 IOC 容器所管理的对象,只需要告诉 IOC 容器帮助我们管理那些对象,这个是通过配置元数据来定义的【元数据可以是 XML 文件、注解或者是 Java 配置类】
Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject
@Autowired 属于 Spring 内置的注解,默认注入方式为 byType 根据类型进行匹配【当一个接口存在多个实现类的时候,byType 方式就无法正确注入对象,这种情况,注入方式会改为 byName 根据名称进行匹配,这个名称通常是首字母小写类名】,@Resource 是属于 JDK 提供的注解,默认注入方式为 byName,如果无法通过名称匹配到对应的 Bean ,注入方式会改为 byType【@Resource 存在两个属性 name 和 type,如果给定了 name 属性值,那么注入方式为 byName,如果指定 type 属性值,那么注入方式为 byType。如果同时给定两个值那么注入方式是 byType + byName (一般不会这么做)】
session:每一次新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效
application/global-session:每个 Web 应用在启动的时候创建一个 bean(应用 bean),该 bean 仅在当前应用启动时间内有效
【如何配置 bean 的作用域?—— 通过 xml 方式,或者是注解 @Scope 的方式】
Spring 框架中的 Bean 是否线程安全,取决于它的作用域和状态。比如在 prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题,所以不存在线程安全问题。而 singleton 作用域下,IOC 容器中只有唯一的 bean 实例,就可能会存在资源竞争问题,也要取决于该 bean 是否有状态,有的话,那么就存在线程安全问题【有状态是指包含了可变的成员变量对象】。一般情况大部分 bean 都是无状态的
AOP 面向切面编程,能够吧与业务无关,却为业务模块所共同调用的逻辑(事务处理、日志管理、权限控制等)封装起来,减少系统的重复代码,降低模块间的耦合度,有利于之后的可扩展性和可维护性【Spring AOP 就是基于动态代理的】