浅浅浅学spring基基基础-爱代码爱编程
文章目录
Spring
学习链接:https://www.w3cschool.cn/wkspring/pesy1icl.html
1、Spring是什么,为什么要使用Spring?
Spring
是一个轻量级的 IoC
和 AOP
容器框架。是提供基础性服务的一套框架,目的是简化企业应用程序的开发,使开发者只需要关心业务需求。
-
IoC
容器会管理依赖的对象,不需要自己创建和管理依赖对象了,让相互协作的组件保持松散的耦合 -
AOP
编程允许把遍布于应用各层的功能分离出来形成可重用的功能组件,更方便处理某一类问题 -
spring
提供了事务支持,使得事务操作变的更加方便。 -
方便框架集成,
spring
可以很方便的集成第三方框架,比如MyBatis
、hibernate
等。
1.常见的配置方式有三种:
-
基于**
XML
**的配置:Bean
所需的依赖项和服务在XML
格式的配置文件中指定。这些配置文件通常包含许多<bean/>
节点的定义和特定于应用程序的配置选项 -
基于**
Java
注解**的配置:- 使用组件扫描可以不必在
Spring
的配置文件中配置各个<bean/>
节点。 - 通过在相关的类、方法或字段声明上使用注解,将
Bean
配置为组件类本身,而不是使用XML
来描述Bean
装配。 - 注意:默认情况下,
Spring
容器中未打开注解装配,使用它之前在Spring
配置文件中启用它。
- 使用组件扫描可以不必在
-
基于类的
Java Config
:- 通过类定义
Spring
配置元数据,直接消除XML
配置文件 - 通过使用
@Bean
和@Configuration
来实现。 @Bean
注解扮演与<bean />
元素相同的角色。用到方法上,表示当前方法的返回值是一个bean
@Configuration
类允许通过简单地调用同一个类中的其他@Bean
方法来定义 Bean 间依赖关系。相当于spring
的配置文件XML
- 通过类定义
这几种方式没有什么所谓的优劣之分,主要看使用情况,一般来说是这样:
- 涉及到全局配置的,例如数据库相关配置、
MVC
相关配置等,就用Java Config
配置的方式 - 涉及到业务配置的,就使用注解方式
2.Spring 框架七大核心模块
-
spring core
容器模块:框架最基础部分,提供IoC
和DI
依赖注入特性。- 依赖注入实现容器对
Bean
的管理,核心容器的主要组件是BeanFactory
,BeanFactory
是工厂模式的一个实现,是任何Spring
应用的核心。 IoC
将应用配置和依赖从实际的应用代码中分离出来
- 依赖注入实现容器对
-
spring context
应用上下文模块:扩展了BeanFactory
的概念- 核心模块的
BeanFactory
使Spring
成为一个容器,而上下文模块使它成为一个框架。 - 提供了许多企业服务
- 核心模块的
-
spring aop
AOP模块:提供面向切面的编程实现,可自定义拦截器、切点、日志等。Spring AOP
模块为基于Spring
的应用程序中的对象提供了事务管理服务- 通过使用
Spring AOP
,不用依赖组件,就可以将声明性事务管理集成到应用程序中
-
spring dao
JDBC抽象和DAO模块:提供了JDBC
的抽象层和异常层次结构。消除了冗长的JDBC
编码和对数据库供应商特定错误代码的解析。 -
spring orm
对象/关系映射集成模块: -
spring web
Web模块:Web
上下文模块建立在应用程序上下文模块之上,为基于Web
的应用程序提供了上下文,提供了Spring
和其它Web
框架的集成 -
spring mvc MVC模块:
Spring
为构建Web
应用提供了一个功能全面的MVC
框架,Spring
的MVC
框架使用IoC
对控制逻辑和业务对象提供了完全的分离
3.Spring 的优点?
(1)Spring
属于低侵入设计,代码污染极低;
(2)控制反转:IOC——Inversion of Control
,指的是将对象的创建权交给 Spring
去创建。使用 Spring
之前,对象的创建都是由我们自己在代码中new
创建。而使用Spring
之后。对象的创建都是给了 Spring
框架。
(3)Spring
的DI
机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(4)面向切面编程:Spring
提供了AOP
技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用;
(5)容器:Spring
是一个容器,因为它包含并且管理应用对象的生命周期
(6)组件化:Spring
实现了使用简单的组件配置组合成一个复杂的应用。在 Spring
中可以使用 XML
和 Java
注解组合这些对象。
(7)一站式:在 IOC
和 AOP
的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上 Spring
自身也提供了表现层的 SpringMVC
和持久层的 Spring JDBC
)
**Spring的特点:**轻量级、控制反转、面向切面、容器化、框架集合
2、Spring IoC 容器的理解
IoC
就是为了解决程序中耦合度太高的问题
1.Ioc 是什么?
Ioc
(Inversion of Controll
控制反转),它不是一种技术,而是一种设计思想
-
控制,谁控制谁,控制什么?
IoC
容器控制对象- 主要是控制外部资源获取(不只是对象,比如文件)
-
反转,哪些方面反转了?
- 由容器查找及注入依赖对象,对象只是被动的接受依赖对象,依赖对象的获取被反转了
-
传统应用程序示意图
- 有
IoC/DI
容器后程序结构示意图
IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
2.IoC 和 DI
DI—Dependency Injection,即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
- 谁依赖谁:应用程序依赖于
IoC
容器 - 为什么需要依赖:应用程序需要
Ioc
容器来提供对象需要的外部资源 - 谁注入谁:
IoC
容器注入应用程序某个对象(应用程序所依赖的对象) - 注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)
二者关系:
- 控制反转(
IoC
)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。 - 它们是同一个概念的不同角度描述
- IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
Spring 提供了以下两种不同类型的容器:
Spring BeanFactory
容器- 一个最简单的容器,它主要的功能是为依赖注入提供支持,这个容器接口在
org.springframework.beans.factory.BeanFactory
中被定义。在资源宝贵的移动设备或者基于applet
的应用当中,BeanFactory
会被优先选择。 - 最常被使用的是
XmlBeanFactory
类。
- 一个最简单的容器,它主要的功能是为依赖注入提供支持,这个容器接口在
Spring ApplicationContext
容器- 是
BeanFactory
的子接口包含BeanFactory
所有的功能,也被称为Spring
上下文,是spring
中较高级的容器。 - 最常被使用的
ApplicationContext
接口实现:FileSystemXmlApplicationContext
:该容器从XML
文件中加载已被定义的bean
。在这里,你需要提供给构造器XML
文件的完整路径。ClassPathXmlApplicationContext
:该容器从XML
文件中加载已被定义的bean
。在这里,你不需要提供XML
文件的完整路径,只需正确配置CLASSPATH
环境变量即可,因为,容器会从CLASSPATH
中搜索bean
配置文件。XmlWebApplicationContext
:该容器会在一个web
应用程序的范围内加载在XML
文件中已被定义的bean
。
- 是
3.SpringBean
称作 bean
的对象是构成应用程序的支柱也是一个被实例化、组装、并通过 Spring IoC
容器所管理的对象。这些 bean
是由用容器提供的配置元数据创建的。
Bean
与 Spring
容器的关系
4.SpringBean 作用域
Spring
框架支持以下五个作用域,分别为 singleton、prototype、request、session 和 global session
5.SpringBean 生命周期
当一个 bean
被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean
不再需要,并且从容器中移除时,可能需要做一些清除工作。
Bean
的生命周期可以表达为:Bean
的定义——Bean
的初始化——Bean
的使用——Bean的
销毁- 详细介绍待后续…
3、Spring AOP 的理解
-
AOP
(面向切面编程),是一种编程思想,是面向对象编程的一种补充,面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。 -
OOP
面向对象编程,允许开发者定义纵向的关系,但并不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。 -
AOP
用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect
),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。 -
在
OOP
中模块化的关键单元是类,而在AOP
中模块化的关键单元是方面。AOP
帮助你将横切关注点从它们所影响的对象中分离出来,然而依赖注入帮助你将你的应用程序对象从彼此中分离出来。 -
利用
AOP
可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP
能够让我们在不影响原有功能的前提下,为软件横向扩展功能。 -
主要功能:可用于权限控制、日志管理、事务、日志处理。
1.Spring AOP三种使用方式
AOP
编程三步:- 定义普通话业务组建
- 定义切入点,一个切入点可能横切多个业务组建
- 定义增强处理,增强处理就是在
AOP
框架为普通业务组件织入的处理动作 - 进行
AOP
编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP
框架将自动生成AOP
代理,即:代理对象的方法=增强处理+被代理对象的方法。
- 方式一:使用
Spring
自带的AOP
- 方式2:使用
Aspectj
实现切面(普通POJO
的实现方式) - 方式3:使用
Aspectj
实现切面(基于注解的实现方式)
2.Apring AOP的实现原理
AOP
的实现是基于代理模式来实现的,AOP
代理主要分为静态代理和动态代理。一般采用动态代理两种混合的实现方式:JDK
动态代理和 `CGLIB 动态代理。实际上
JDK
动态代理:Spring AOP
的首选方法。 每当目标对象实现一个接口时,就会使用JDK
动态代理。目标对象必须实现接口CGLIB
代理:如果目标对象没有实现接口,则可以使用CGLIB
代理。
2.1 使用 JDK
动态代理
- 组件一:
InvocationHandler
接口- 首先编写一个类,去实现该接口,重写
invoke()
(提供的代理方法)
- 首先编写一个类,去实现该接口,重写
- 组件二:
Proxy
类- 通过使用该类的
newProxyIntance()
方法,返回一个代理对象
- 通过使用该类的
- 然后通过代理对象调用方法时,底层将通过反射,调用我们实现的
InvocationHandler
接口中的invoke()
2.2 CGLIB 代理
Cglib
是一个强大的、高性能的代码生成库,它广泛被许多AOP
框架使用,提供方法的拦截,如下图所示Cglib
与Spring
等应用的关系:
Cglib
的实现是在字节码的基础上的,并且使用了开源的 ASM
读取字节码,对类实现增强功能的。
2.3 二者优缺点
JDK
动态代理- 优点
JDK
动态代理是JDK
原生的,不需要任何依赖即可使用;- 通过反射机制生成代理类的速度要比
CGLib
操作字节码生成代理类的速度更快;
- 缺点
- 要使用
JDK
动态代理,被代理的类必须实现了接口,否则无法代理; JDK
动态代理执行代理方法时需要通过反射机制进行回调,此时方法执行的效率比较低;JDK
动态代理无法为没有在接口中定义的方法实现代理。假设我们有一个实现了接口的类,我们为它的一个不属于接口中的方法配置了切面,Spring
仍然会使用默认JDK
动态代理,但是由于配置了切面的方法不属于接口,为这个方法配置的切面将不会被织入。
- 要使用
- 优点