Spring系列开篇 — 核心功能 IoC, AOP (附事务管理,spring与mybatis整合等)

概述
Spring是什么?

广义上讲,Spring指的是Spring技术栈,或Spring生态。这些技术栈涵盖了web应用,大数据,云计算等各个方面。

狭义地讲,Spring指的就是Spring生态中的 Spring Framework。这也是我们常说的Spring。而Spring Framework中最核心的部分就是IoC(控制反转)与AOP(面向切面编程)。

如果你在百度上搜索"Spring 是什么",得到的答案大概是:Spring是一个分层的JavaEE一站式轻量级开源框架。这是广义上的Spring,也是较为官方的定义。

根据官网(https://spring.io/projects)所述,从配置到安全,从web应用到大数据,Spring均有涉足。

Spring生态整体采用了模块化设计,针对不同的场景,可以选用Spring生态中的不同模块进行开发。如简单的Web应用我们可以用 Spring Framework ,微服务场景我们可以用SpringBoot,SpringCloud。

下图展示了Spring生态中所包含的各个模块。

而就算是Spring Framework 这个核心模块,它包含的内容也是非常丰富的。根据其官方文档,我们可以看到,Spring Framework 中包含了IoC容器,AOP等核心功能;测试相关内容;数据访问相关的 事务,JDBC,ORM等;Web部分(基于Servlet)的SpringMVC,WebSocket,甚至还有支持响应式Web的WebFlux;以及JMS消息服务,邮件服务,任务调度等。

Spring Framework内部也采用了模块化设计,我们可以按需选择其中的模块进行使用。其结构如下图

其中最核心的部分,便是Core Container(Spring核心容器),可以看到,其他的如Web和Data Access都是以Core Container为基础的。

Core Container又分为4个子模块:Beans,Core,Context,SpEL,这4个子模块对应了4个jar包,在pom.xml中就对应了4个dependency


Spring的简单介绍就到这里,下面对Spring中的一些重要概念进行说明。

重要概念
IoC:控制反转。它不是一种具体技术,而是一种编程思想。详见附录IoC
DI:依赖注入。是对IoC从不同角度的描述,详见附录IoC
AOP:面向切面编程。能够在不修改源代码的情况下,对类做一些增强(添加一些额外功能),详见附录aop
Spring容器:指的就是IoC容器,在Spring的底层源码中对应了BeanFactory这个接口,负责创建和管理对象(bean实例)
快速入门
Spring最最核心的就是IoC容器(即Spring容器),Spring在启动时,会扫描相关配置,完成对象的创建和相关依赖的装配。Spring的快速入门demo如下

打开IDEA,创建一个maven项目,在pom.xml中添加spring的核心依赖包


项目结构如下

运行测试

可以看到,Spring做的无非就是提供了一个容器,在这个容器里帮你创建所需要的各种类的对象,并解析各个类对象之间的依赖关系,自动完成依赖注入(上面的示例将PetDao对象注入到了PetService对象中)。随后可以调用Spring容器的getBean方法,取出所需要的对象来使用即可。

下面对Spring的核心功能IoC,进行一个较为详细的说明。

基本使用
Spring的基本配置可以通过XML或者注解的方式进行。

纯XML
IoC配置
通过配置,告诉Spring,需要创建哪些对象(对象,bean实例,bean,说的都是同一个东西)到Spring容器中。

通过<bean>标签,即可将一个对象注册到Spring容器中,如

<!-- 完整的xml配置模板见前文【快速入门】  -->
<bean id="petDao" class="org.litespring.pojo.PetDao"/>
1
2
默认情况下Spring会调用类的无参构造函数来实例化对象,若没有无参构造函数则会实例化失败。(若<bean>标签中,有通过<constructor-arg>子标签配置构造器参数时,则会调用带参数的构造函数进行实例化。其他的不常用的实例化方式参考这里)。<bean>标签的相关属性说明如下

id

对象在Spring容器中的唯一标识。也叫bean的id,或者bean的名称。当不指定id时,默认使用简单类名的小写作为id。

class

唯一一个必填属性。指定类的全限定名。Spring会通过反射来创建一个该类的对象,默认调用无参构造函数。

init-method

指定类中的初始化方法。在bean实例化完成(实例化指的是给这个对象分配内存空间,可以简单理解为,相当于代码中的new),依赖注入完成后,Spring会调用该属性指定的方法,进行一些自定义的初始化操作。可参见bean的生命周期。

注:通过注解配置bean时,可以通过@PostConstruct(在类的某个方法上打上该注解)完成类似的功能。只是@PostConstruct的执行顺序要早于init-method(若同时配置)

destroy-method

有自定义初始化方法,也就有自定义的销毁方法。该属性指定了,当对象在Spring容器中被销毁时(准确地说是被销毁之前),需要执行的方法(一般是用来做一些资源的释放和清理)。

对应注解中的@PreDestroy,只是@PreDestroy的执行顺序要早于destroy-method(若同时配置)

scope

指定bean的作用范围。有如下几种取值

singleton:默认值,单例。bean对象在整个Spring容器中只有1个。

生命周期:当Spring容器初始化时,被创建,随后bean一直存活,直到应用关闭,Spring容器销毁时,bean才被销毁。

prototype:原型。每次从Spring容器中获取该bean时(每次调用BeanFactory中的getBean方法时),都会创建一个新的对象,也就是说bean是多例的。

生命周期:当获取该bean时,创建一个新的对象实例,对象若被使用,就一直存活,当对象没有被任何地方引用,则会由垃圾回收器进行回收。

request:仅在web环境下有该配置。每次请求会创建一个新的bean,bean的存活周期和一次请求的周期一致。请求到来时,新建一个bean,请求结束时,bean被销毁。

需要结合<aop:scoped-proxy/>标签使用,该值不常用。

session:仅在web环境下有该配置。每个会话(HttpSession)创建一个新的bean,bean的存活周期和一次会话的周期一致。会话开启时,新建一个bean,会话结束时,bean被销毁。

需要结合<aop:scoped-proxy/>标签使用,该值也不常用。

对于Spring中bean的request和session作用域,想要进一步了解,可参考这篇文章

DI配置
依赖注入配置。通过配置,让Spring自动把一个类对象所需要的东西注入给它。

首先,什么是依赖?依赖是一个bean实例中的属性,比如下面这个类


这个类中的3个属性,都属于这个类的依赖。

依赖(或属性),根据其变量的类型,又可以分为3大类

简单类型:8大Java基本类型和String
对象类型:自定义的Java类(POJO)
集合类型:jdk中自带的:List,Set,Map等
依赖注入则是对这些属性,进行赋值,这也是交给Spring去完成的。

依赖注入有如下2种方式

构造函数注入
————————————————
版权声明:本文为CSDN博主「抠脚的大灰狼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vcj1009784814/article/details/115533717

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值