Spring概况和框架介绍

目录

1 spring介绍

2 spring发展历程

3 spring带来的改变

4 spring 的架构分层

5 依赖注入

6 控制反转

7 AOP面向切面编程

8 什么是框架

8.1 为什么要使用软件框架

8.2 spring下载


1 spring介绍

spring框架 是一个轻量级的解决方案,并且提供了java企业级的构建服务,它使得java程序开发变得简单高效。

spring是模块化的设计,我们可以使用IOC容器和java工程一起使用(比如一些不依赖容器的服务,像任务管理,批处理服务),也可以仅引入Hibernate集成代码或JDBC抽象层访问数据库。spring框架支持声明式事务管理,通过RMI或Web services远程访问你的程序, 以及各种持久化数据的选项。

spring除支持java语言开发外,还支持Groovy和Kotlin。从Spring Framework 5.1开始,Spring需要使用JDK 8+ ,并为JDK 11 LTS提供开箱即用的支持。

spring是一个开源的框架,它拥有一些活跃的社区,如github, spring.io官网,这些社区提供各种应用场景的使用反馈,bug收集。

2 spring发展历程

在spring之前,EJB是当时最火热的方案,很多知名公司都是采用此方案进行项目开发。但是spring创始人Rod Johnson认为EJB过于臃肿,并不是每个项目都适用于EJB这种大型框架。在2001年10月份,他发表了《Expert One-on-One J2EE》,阐述了JAVA EE和EJB组件框架中的一些弊端,在这本书中,他提出了一种基于普通javabean和依赖注入更简单的方案。

2003年,Rod Johnson和他的伙伴开发了全新的框架spring 0.9

2004年3月份,spring1.0发布

spring1.0仅支持xml配置方式,通过xml定义bean和bean之间的引用。

2006年10月份,spring2.0发布

随着jdk1.5版本开始支持注解,spring2.x版本开始使用注解对bean进行配置,大大简化了xml的配置,提高项目的开发效率。

2009年12月份,spring3.0发布

spring3.x版本开始,spring开始提供javaconfig的方式,通过javaconfig可以快速配置spring及bean之间的依赖关系。

2013年12月份,Pivotal 宣布发布 Spring 框架 4.0。

2017 年 09 月,Spring 5.0 GA 发布。

spring5.x版本开始,提供对jdk8+的支持,webflux支持反应式编程模型,并且对kotlin进行全方面的支持。

 

3 spring带来的改变

spring是一个JAVA平台,可为JAVA应用程序提供综合性的基础服务设施。spring提供基础服务封装,开发人员可以更关心于业务及应用程序。 spring通过非侵入性服务,让你能够通过普通pojo对象构建企业级应用程序。 作为应用程序开发人员,通过spring受益的示例如下:

  1. 使Java方法在数据库事务中执行,而不必处理事务API。
  2. 使本地Java方法成为HTTP入口,而不必处理Servlet API。
  3. 使本地Java方法成为消息处理程序,而不必处理JMS API。
  4. 使本地Java方法成为管理操作,而不必处理JMX API。

4 spring 的架构分层

在应用程序开发中,spring提供一套完整的方案,从http入口请求,到service业务处理,数据库持久层,spring作用于整个流程中。

5 依赖注入

java应用程序,无论是嵌入式的应用程序,还是N层的应用程序,服务端程序通常是由应用程序的对象组成的,这些应用程序中的对象互相依赖。 在传统项目中,假如我们需要一个对象或者功能,通常都是由我们主动创建赋值,在这个过程中,可能需要加载比较复杂的上下文条件。这种在大型应用开发、迭代中是非常费时且麻烦的。 而依赖注入,则简化了这个流程,通过一个管理容器,达到了引用即创建,创建就可以引用。

public class Animal{
    private Cat cat;

    public Animal(Cat cat) {
        this.cat = cat;
    }

}

在这个代码中,cat对象是在Animal构造方法中引用,非Animal这个类本身创建,像这种非自己主动创建的引入,则称为依赖注入。

6 控制反转

控制反转是一种设计思想,而不是一种技术。 IOC是面向对象编程的一种升华,它能指导我们如何编写低耦合,健壮性,可复用的程序。

如上图所示,类内部对外透明,调用者不需要关注类的内部逻辑,调用非通过IOC容器达到声明即调用的方式,降低了类对象创建,上下文加载的难度。

7 AOP面向切面编程

aop,即面向切面编程,通过预编译和运行时动态织入代码的方式来实现对程序统一维护、管理的一种技术。AOP是spring的一个重要内容,也是函数式编程的衍生,也是OOP的延续。 一般情况下,在业务程序中,如果想对业务程序进行监控,或者超时统计,异常处理等,可能需要在每个代码段中去添加这些处理逻辑。但是通过AOP可以对有共同特性的业务逻辑进行统一的监控,维护和管理,大大提高了开发效率,减少代码的冗余,提高了代码的维护性。 

8 什么是框架

软件框架(software framework),通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。(来源百度百科)

框架就是一套规范,开发人员在这个规范下协同开发,快速迭代应用程序及版本。

8.1 为什么要使用软件框架

  1. 开发效率快,软件框架就如搭好的框架房,开发人员在里面填充自己的功能和装饰即可
  2. 可靠性强,一个成熟的框架都是经过市场的验证
  3. 松耦合 通过框架,我们可以将业务代码抽离封装,实现一个松耦合的编程方式
  4. 可维护性强

8.2 spring下载

spring源码下载地址: https://github.com/spring-projects/spring-framework/tree/4.2.x

 

### HAL_TIM_PeriodElapsedCallback 函数功能与用法 #### 1. 功能描述 `HAL_TIM_PeriodElapsedCallback` 是 STM32 HAL 库中的回调函数,用于处理定时器周期结束事件。当定时器的计数值达到设定的最大值并触发更新事件时,该回调函数会被调用[^1]。 此函数的主要作用是在中断服务程序中被自动调用,允许用户在不修改底层驱动的情况下实现自定义逻辑。它通常用来响应特定的时间间隔到达后的动作,例如刷新数据、切换状态或其他实时任务调度[^2]。 --- #### 2. 定义形式 以下是 `HAL_TIM_PeriodElapsedCallback` 的典型定义: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 用户可以在此处编写自己的代码来处理定时器周期溢出事件 } ``` - **参数说明** - `TIM_HandleTypeDef *htim`: 这是一个指向定时器句柄结构体的指针,包含了配置运行状态的信息。通过这个句柄,可以在回调函数内部访问当前定时器的相关属性或重新设置其行为。 --- #### 3. 使用方法 为了使能这一回调机制,需完成以下几个步骤: 1. 初始化定时器:利用 `HAL_TIM_Base_Init` 或其他初始化接口完成硬件资源分配以及基础参数配置(如预分频系数、计数器周期等)。 2. 启动带中断模式的定时器:调用 `HAL_TIM_Base_Start_IT(htim)` 来开启定时器及其关联的中断请求。这一步会启用相应的中断线,并注册默认的中断服务例程(ISR)[^1]。 3. 实现回调函数:根据实际需求重写 `HAL_TIM_PeriodElapsedCallback` 方法的内容。每当发生一次完整的计数循环后,即进入下一轮计数前,都会跳转到此处执行指定的操作[^3]。 4. 清除标志位/中断挂起比特 (可选): 如果需要手动管理某些特殊类型的干扰信号,则可能还需要借助宏指令如 __HAL_TIM_CLEAR_IT() 对应位置零操作。 --- #### 示例代码片段 下面展示了一个简单的应用案例——每秒钟点亮 LED 一次: ```c #include "stm32f4xx_hal.h" // 假设已正确设置了 GPIO TIM 句柄 htim2 uint8_t led_state = 0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM2){ // 判断是否来自 TIM2 中断 if(led_state == 0){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 打开LED led_state = 1; } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭LED led_state = 0; } } } int main(void){ /* MCU Initialization */ // 配置GPIO PA5作为输出端口 // 设置 TIM2 参数 TIM_HandleTypeDef timHandle; timHandle.Instance = TIM2; timHandle.Init.Prescaler = 8399; // 设定预分频值使得频率接近1KHz timHandle.Init.CounterMode = TIM_COUNTERMODE_UP; timHandle.Init.Period = 9999; // 计数至最大值约等于一秒 timHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&timHandle) != HAL_OK){ Error_Handler(); } // 开启 IT 模式的定时器 HAL_TIM_Base_Start_IT(&timHandle); while(1); } ``` 上述例子展示了如何结合外部设备控制形成规律性的脉冲序列。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值