本文对比了静态工具类封装与Spring Bean依赖注入两种模式的实现与使用差异。静态工具类通过手动初始化将Spring管理的Bean注入到静态变量中,使用时直接调用类方法,适合纯粹的功能性操作;而Spring Bean模式由容器托管生命周期,支持依赖注入和AOP等特性,适合包含业务逻辑的组件。实际开发中应根据场景选择:工具类操作使用静态封装提升简洁性,…

本文最初发布于 CSDN,现迁移至本站并做格式整理。内容保留原始观点与发布时间。

静态工具类封装

RedisClient 是一个普通的 Java 类,其内部持有一个静态的 RedisTemplate 引用。由于它不被 Spring 容器托管,无法通过 @Autowired 自动注入依赖,因此需要通过手动初始化的方式,将 Spring 管理的 Bean 注入到该类的静态变量中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class RedisClient {
// 静态变量,属于类本身,不属于对象实例
private static RedisTemplate<String, String> template;

/**
* 初始化方法:由外部配置类调用,将 Spring 管理的 Bean 赋值给静态变量
*/
public static void register(RedisTemplate<String, String> template) {
RedisClient.template = template;
}

// 封装具体业务方法,对外提供简洁的静态调用
public static void hIncr(String key, String field, Integer cnt) {
// 空值校验与异常处理...
template.opsForHash().increment(key, field, cnt);
}
}

由于 RedisClient 脱离了 Spring 容器的管理,我们需要创建一个配置类作为“桥梁”。利用 Spring 的 构造器注入 特性,在配置类初始化时获取 RedisTemplate 实例,并立即调用 RedisClient.register() 完成静态工具类的初始化。

1
2
3
4
5
6
7
8
9
10
@Configuration
@ComponentScan(basePackages = "com.github.paicoding.forum.core")
public class ForumCoreAutoConfig {

// 利用 Spring 构造器注入,确保 redisTemplate 在使用前已实例化
public ForumCoreAutoConfig(RedisTemplate<String, String> redisTemplate) {
// 【关键步骤】将 Spring 容器中的 Bean 注入到静态工具类中
RedisClient.register(redisTemplate);
}
}

Spring Bean 依赖注入

这是 Spring 开发中最标准的模式。类(如 UserService)的生命周期由 Spring IoC 容器 完全接管。容器负责创建对象、维护单例(Singleton)状态以及注入所需的依赖。

  • 实例调用:必须通过对象实例来调用方法,而非类名。
  • 容器托管:支持 AOP(面向切面编程)、事务管理(@Transactional)等高级特性。
  • 依赖注入:使用方必须声明 @Autowired 或通过构造器声明依赖,由容器在运行时自动装配。

调用方式对比与实例

在实际业务代码中,这两种模式的使用差异如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@RestController
public class ArticleController {

// 【模式一:标准 Bean 依赖注入】
// ArticleService 是受管 Bean,包含业务逻辑和事务控制,必须通过 DI (依赖注入) 获取实例
@Autowired
private ArticleService articleService;

// 【模式二:静态工具类】
// RedisClient 是通用工具,无需注入,直接通过类名访问静态方法
// 优势:代码简洁,随处可用

@GetMapping("/article/{id}")
public String getArticle(@PathVariable Long id) {

// 1. Bean 模式调用:
// 这里的 articleService 是容器提供的单例对象(或代理对象)
articleService.queryById(id);

// 2. 静态工具类模式调用:
// 直接调用静态方法,底层复用了之前注册进去的 RedisTemplate
RedisClient.hIncr("article_" + id, "view", 1);

return "success";
}
}

总结:

  • 对于纯粹的功能性操作(如操作缓存),使用静态工具类封装可以极大简化代码,避免到处写 @Autowired。
  • 对于包含业务逻辑、需要事务或扩展性的组件,必须使用 Spring Bean 模式,以充分利用容器提供的强大的生命周期管理能力。