百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Spring框架基础知识-第六节内容(Spring高级话题)

ccwgpt 2025-07-14 15:20 1 浏览 0 评论

Spring高级话题

Spring Aware

基本概念

Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。若使用了Spring Aware,你的Bean将会和Spring框架耦合。

Spring提供的Aware接口

BeanNameAware

获得容器中bean的名称。

BeanFactoryAware

获得当前bean factory,这样可以调用容器的服务。

ApplicationContextAware

当前的application context,这样可以调用容器的服务。

MessageSourceAware

获得message source,这样可以获得文本的信息。

ResourceLoaderAware

获得资源加载器,可以获得外部资源文件。

说明:Spring Aware的目的是为了让Bean获得Spring容器的服务,所以Bean实现ApplicationContextAware接口可以获得Spring容器的所有服务,但原则上我们还是用到什么接口就实现什么接口。

示例代码

准备在包下新建一个jin.txt文本,内容随意自己定,给下面的外部资源加载使用。

(1)新建一个AwareService的Bean

实现BeanNameAware,ResourceLoaderAware接口。



说明:

1、实现BeanNameAware、ResourceLoaderAware接口,获得Bean名称和资源加载的服务。

2、实现ResourceLoaderAware接口需要重写setResourceLoader()方法。

3、实现BeanNameAware需要重写setBeanName()方法。

(2)新建配置类Config



(3)编写测试类



运行结果:



多线程

基本概念

Spring通过任务执行器(TaskExecutor接口)来实现多线程和并发编程,使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的。所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务

说明:主要使用@EnableAsync、@Async这两个注解。

示例代码

(1)编写配置类



说明:利用@EnableAsync注解开启异步任务支持。配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池的TaskExecutor。

(2)任务执行类



说明:通过@Async注解表明该方法是个异步方法,如果注解在类级别上,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。

(3)运行



结果:



说明:结果是并发执行而不是顺序执行

计划任务

基本概念

从Spring3.1开始,计划任务在Spring中的实现变得非常简单,首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在要执行计划任务的方法上注解@Scheduled,声明这是一个计划任务

Spring通过@Scheduled支持多种类型的计划任务,包含cron、fixDelay、fixedRate等。

使用了两个注解:@EnableScheduling、@Scheduled

实现的功能

实现定时任务。

示例代码

(1)编写计划任务执行类



说明:

1、通过@Scheduled注解声明方法是计划任务,使用fixedRate属性每隔固定时间就会执行

2、使用cron属性可按照指定时间执行,本例指的是每天11点28执行,cron是unix和linux系统下的定时任务。

(2)配置类



说明:

通过@EnableScheduling注解开启对计划任务的支持。

(3)运行



结果:



条件注解(@Conditional)

基本概念

Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。

@Conditional根据满足某一个特定条件创建一个特定的Bean,比如:只有某个Bean被创建才会创建另外一个Bean,总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置。在Springboot中将会大量应用到条件注解。

实现的功能

可以开启类的自动配置

示例代码

(1)判断条件定义

首先声明一个WindowsCondition类,并实现Condition接口,重写matches方法。



声明一个LinuxCondition类,并实现Condition接口,重写matches方法。



(2)不同系统下Bean的类

声明一个接口



声明WindowsListService类,实现这个接口



声明LinuxListService类,实现这个接口



(3)声明配置类



说明:通过@Conditional注解,符合windows条件则实例化windowsListService对象,符合Linux条件则实例化LinuxListService对象。

(4)运行



结果:



组合注解和元注解

基本概念

Spring的注解主要用来配置和注入Bean,以及AOP相关配置,随着注解的大量使用,尤其相同的多个注解用到各个类和方法中,会相当的频繁,这就是所谓的样板代码,是Spring设计原则中要消除的代码。

所谓元注解就是可以注解到别的注解上的注解,被注解的注解称之为组合注解,组合注解具备注解上的元注解的功能,Spring的很多注解都可以作为元注解,而且Spring本身已经有很多组合注解,如@Configuration就是一个组合@Component的注解,表明这个类其实也是一个Bean。

实现的功能

多个注解合并为一个注解

代码示例

(1)定义一个组合注解



说明:组合@Configuration元注解,组合@Component元注解。覆盖value参数。

(2)定义一个Bean



(3)定义配置类



说明:使用@WiselyConfiguration组合注解替代@Configuration和@ComponentScan。

(4)运行



结果:



@Enable*注解的工作原理

通过简单的@Enable*来开启一项功能的支持,从而避免自己配置大量的代码,大大降低了使用难度。通过观察@Enable*注解的源码,我们发现所有的注解都有一个@Import注解,@Import是用来导入配置类的,这也就意味着这些自动开启的实现其实是导入了一些自动配置的bean

测试

基本概念

单元测试只针对当前开发的类和方法进行测试,可以简单通过模拟依赖来实现,对运行环境没有依赖,但是仅仅进行单元测试是不够的,它只能验证当前类或方法能否正常工作,而我们想要知道系统的各个部分组合在一起是否能正常工作,这就是集成测试存在的意义。集成测试为我们提供了一种无须部署或运行程序来完成验证系统各部分是否能正常协同工作的能力。

Spring通过Spring TestContext Framework对集成测试提供顶级支持,它不依赖于特定的测试框架,既可以使用Junit,也可以使用TestNG

Spring提供了SpringJUnit4ClassRunner类,它提供了Spring TestContext Framework的功能,通过@ContextConfiguration来配置ApplicationContext,通过@ActiveProfiles确定活动的profile。

实现的功能

实现集成测试和单元测试

代码示例

(1)增加Spring测试的依赖包到maven



(2)编写一个Bean



(3)编写配置类



(4)运行测试



说明:

1、SpringJUnit4ClassRunner类在Junit环境下提供了Spring TestContext Framework的功能。

2、@ContextConfiguration注解用来加载配置ApplicationContext,其中classes属性用来加载配置类。

3、@ActiveProfiles用来声明活动的profile

4、使用普通的@Autowired注入Bean

5、测试代码,通过Junit的Assert来校验结果是否和预期一致。

结果:


相关推荐

RACI矩阵:项目管理中的角色与责任分配利器

作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...

在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」

慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...

Scrum模式:每日站会(Daily Scrum)

定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...

大家都在谈论的敏捷开发&Scrum,到底是什么?

敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...

敏捷与Scrum是什么?(scrum敏捷开发是什么)

敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...

敏捷项目管理与敏捷:Scrum流程图一览

敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...

一张图掌握项目生命周期模型及Scrum框架

Mockito 的最佳实践(mock方法)

记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...

EffectiveJava-5-枚举和注解(java枚举的作用与好处)

用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...

Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!

Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...

Java单元测试框架PowerMock学习(java单元测试是什么意思)

前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...

Spring框架基础知识-第六节内容(Spring高级话题)

Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...

Java单元测试浅析(JUnit+Mockito)

作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...

揭秘Java代码背后的质检双侠:JUnit与Mockito!

你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...

单元测试框架哪家强?Junit来帮忙!

大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...

取消回复欢迎 发表评论: