专业的编程技术博客社区

网站首页 > 博客文章 正文

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

baijin 2025-07-23 12:55:16 博客文章 3 ℃ 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来校验结果是否和预期一致。

结果:


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表