一、Spring框架概述
1.什么是Spring
Spring是一个轻量级的Java 开发开源框架,用于构建企业级应用程序。它提供了一组广泛使用的技术和API,包括依赖注入、AOP、数据访问、事务管理、Web开发和集成测试等。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件。Spring框架的主要目标是帮助开发人员提高生产力和系统可维护性。Spring的核心是控制反转(IoC)和面向切面(AOP)。
1.1、Spring框架高内聚低耦合
Spring框架是一个非常流行的Java开发框架,它的设计原则之一就是高内聚低耦合。
所谓高内聚,就是指一个模块或一个类只负责完成自己的任务,不涉及其他模块或类的业务逻辑。这样的设计能够保证模块或类的功能单一,易于维护和扩展。
而低耦合则指不同的模块或类之间的依赖关系尽量降低,相互之间的影响越小越好。这样的设计能够实现模块和类之间的独立性,模块或类的修改对其他模块或类的影响也会降到最低。
Spring框架在实现高内聚低耦合的原则方面做得非常好,它采用了依赖注入(DI)和面向切面编程(AOP)等技术,将模块或类之间的依赖关系降到最低,使得整个系统具有良好的可维护性和扩展性。
1.2、Spring的优点
-
松耦合:Spring 采用松耦合的设计思路,使得应用程序更加灵活、可扩展和易于维护。
-
IOC 容器:Spring 框架提供了一个 IOC 容器,可以管理和组装对象之间的依赖关系,使得应用程序开发更加容易。
-
AOP 支持:Spring 框架支持面向切面编程(AOP),可以实现关注点分离,提高代码可复用性和可维护性。
-
事务管理:Spring 框架提供了一个强大的事务管理框架,可以方便地管理事务,减少了开发人员的工作量。
-
集成众多框架:Spring 框架可以与众多其他框架集成,例如 Struts、Hibernate、MyBatis、Quartz 等,使得应用程序开发更加便捷。
-
简化开发:Spring 框架提供了一系列简化开发的工具和模板,例如 Spring MVC、Spring Boot 等,可以大大降低开发成本和时间。
-
社区支持:Spring 框架是一个广泛使用的开源框架,拥有强大的社区支持和完善的文档,可以为开发人员提供良好的支持。
二、控制反转(IOC) 和依赖注入
(一)控制反转
IOC( Inversion of Control,中文释义:控制反转 ) 是Spring框架的核心思想之一,主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;
○ 控制 :指的是对象创建(实例化、管理)的权力
○ 反转 :控制权交给外部环境(Spring框架、IoC容器)
(二)依赖注入
1.基本概念
DI(Dependecy Inject,中文释义:依赖注入) 是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象。(例如在MyBatis整合Spring时,SqlSessionFactoryBean 依赖IOC容器注入一个 DataSource数据源bean)。
2.DI注入的数据类型:
- 注入对象
- 注入基本类型与String
- 复杂类型list arry set map properties
3.DI实现方式:
- set注入=通过set方法维护对象之间的依赖关系
- 构造注入=通过构造方法维护对象之间的依赖关系
- 属性注入(不推荐)
(1)set注入DI实现步骤:
1.给属性提供set方法
2.在bean标签内部开启配置
- 配置位置:<bean>此位置</bean>
- 配置语法:<property 属性名="属性值"></property>
- 配置属性:
name | 属性名称 |
value | 属性值 |
ref | 属性值的引用构 |
(2)构造注入DI实现步骤:
1.给属性提供构造方法
2.在bean标签内部开启配置
- 配置位置:<bean>此位置</bean>
- 配置语法:<constructor-arg 属性名="属性值"></constructor-arg>
- 配置属性:
name | 构造方法参数名称 |
index | 构造方法参数下标 |
type | 构造方法参数类型 |
value | 属性值 |
ref | 属性值的引用 |
三、SpringIOC容器对bean的管理
(一)bean的自动装配
手动装配:
<constructor-arg></constructor-arg>
<property></property>
语法:
- autowire="属性值"
- default-autowire="属性值"
位置:
- bean标签---->局部设置
- beans标签--->全部设置
属性:
- byName============>通过set方法按照名称自动装配,属性名称与bean的id
- byType============>通过set方法按照类型自动装配,属性类型与bean的class
- constructor=======>通过构造方法按照自动装类型配,属性类型与bean的class
注意:
- 全局,局部均设置,则就近原则
- 大型项目不建议使用,自动装配可读性低
- 自动装配一般只装配javaBean
(二)bean的实例化
通过类的无参构造方法实例化(默认)
通过指定工厂创建对象
通过指定静态工厂创建对象
(三)bean的生命周期(单例)
四个阶段:实例化-->属性注入-->初始化-->销毁
1.实例化
2.属性赋值
3.初始化
- 接口初始化InitializingBean
- 属性初始化init-method
4.操作使用
5.销毁
- 接口销毁DisposableBean
- 属性销毁destory-method
(四)bean的作用域
语法:scope="属性"
属性:
singleton=====>单例,性能↑,安全性↓
prototype=====>多例,性能↓,安全性↑
web环境
request=======>一个请求创建javaBean
session=======>一个会话创建javaBean
四、面向切面(AOP)
AOP(Aspect-Oriented Programming: 面向切面编程):
将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”(Aspect),便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP 基于动态代理实现:
- 如果被代理的对象,已经实现某个接口,则 Spring AOP 会使用 JDK Proxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);
- 如果被代理的对象,没有实现某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib,基于继承的方式,生成一个被代理对象的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enhancer类)。
AOP通知类型
AOP将抽取出来的共性功能称为通知;通知类型:以通知在上下文中的具体位置作为划分
- 前置通知(Before)
- 后置通知(After)
- 返回通知(After-returning)
- 异常通知(After-throwing)
- 环绕通知(Around)
- AOP连接点(Join point):AOP将所有的方法都视为连接点,不管是接口里面的抽象方法,还是实现类里面的重写方法,都是连接点
- AOP切点(Pointcut):AOP将可能被抽取共性功能的方法称为切入点。切入点是连接点的子集
- AOP目标对象(Target):就是挖掉功能的方法对应的类生的对象,这种对象是无法直接完成最终工作的
- AOP织入(Weaving):就是将挖掉的功能回填的动态过程
- AOP切面:切点+通知