Spring
1.概述
1.1 简介
开源免费的、轻量级的、非侵入式的容器(一个服务器软件,一个框架),类与类之间的管理,帮助开发人员创建对象,管理对象等的一款 Java 开发框架。
针对接口编程,解耦合。
1.2 核心思想
- IOC(控制反转)
- AOP(面向切面编程)
思想是上层建筑,不是具体的实现。好比:JVM 中方法区和元空间之间的关系。
1.3 优缺点
1.3.1 优点
-
轻量
Spring 核心功能所需的jar总共3M左右
-
针对接口编程,解耦合
通过 Spring 提供的IOC容器,可以将对象间的依赖关系交由 Spring 控制,避免在代码中通过代码相互使用。
用户也不必为单例模式类、属性文件解析等底层需求编写代码,可以更专注于上层的应用。
-
AOP 编程的支持
通过 Spring 的AOP功能,方便进行面向切面编程,许多不容易用传统 OOP (面向对象编程)实现的功能可以通过AOP轻松实现。
-
方便集成各种优秀框架
1.3.2 缺点
- 框架封装内部复杂
- 不易精通
2.IOC
2.1 简介
IOC(Inversion of Controller)(控制反转),分为控制和反转两部分。
把对象的创建、赋值、管理工作都交给代码之外的容器实现,也就是对象的创建是其它外部资源完成。
2.1.1 控制
对象的创建、管理、赋值、对象的声明周期和对象之间的关系等权限。
2.1.2 反转
2.1.2.1 正转
开发人员在代码中,使用 new 构造器创建对象,开发人员掌握了对象的创建、属性赋值、对象从开始到销毁的全部过程,开发人员对 对象有全部的控制。
2.1.2.2 反转
开发人员将管理对象的权限转移给代码之外的容器实现。由容器完成对象的管理,只需定义对象。
2.2 Spring 中的 IOC
在 Spring 中 IOC 的思想是通过 DI(依赖注入)实现,DI 底层通过反射机制实现(序列化也可以实现相关功能)。
开发人员只要知道需要使用对象的名称就行,其他的一切交给容器,其他容器内部的实现细节,无需关注。
通过 IOC 减少对代码的改动,也能实现不同的功能,实现业务对象之间的解耦合。例如:能实现service和dao对象之间的解耦合。
2.2.1 依赖
Class A 使用了 Class B 的属性或方法,就称为 A 依赖了 B。
2.2.2 注入
每一个 Bean(类的实例,在 Spring 中称为Bean)的属性都通过容器注入。注入的方式分为构造注入(构造器,显示的在类中进行声明包括无参构造器)、Set 注入(Spring 中通过 Set 进行 Bean 的属性注入)和自动注入
2.2.2.1 自动注入
构造器注入和 Set 注入在 Java 中比较常见,在 Spring 中还有自动注入,可以根据 类的类型或实例的名字进行注入赋值。
-
byName:按名称注入,Java 类中引用类型的属性名和 Spring 容器中 Bean 的【id】一样,
数据类型一样,将容器中的这个 Bean 赋值给引用类型 -
byType:按类型注入,Java 类中引用类型的是【数据类型】和 Spring 容器中的【class】是同源关系的,
这样的 Bean 就能赋值给引用类型注意:如果出现多个同源,则会注入失败
2.2.2.2 实例演示
通过 Spring 中的配置文件的方式演示。
构造注入
<bean id="xxx" class="xxx">
<constructor-arg name="xxx" value="xxx"/>
<!-- index代表构造器中的参数位置 -->
<constructor-arg index="0/1/2/..." value="xx"/>
</bean>
第一行:
id:指定实例的名称,也就是在容器中存在的名字,其他 Bean 通过这个id进行调用,id区分大小写
class:实例类的静态类型的全路径
Set 注入
<property name="属性名