别再重复造轮子!SpringBoot 内置的 20个高效工具类

别再重复造轮子!SpringBoot 内置的 20个高效工具类

一、数据处理

1. StringUtils

Spring 提供的 StringUtils 相比 Apache Commons Lang 版本更加轻量,且与 Spring 生态完美集成。它提供了字符串判空、截取、拼接等常用操作,比如:

// 判断字符串是否为空
StringUtils.isEmpty(str); 

// 判断字符串是否有内容
StringUtils.hasText(str);

// 数组合并成字符串
StringUtils.arrayToCommaDelimitedString(arr);

2. ObjectUtils

处理对象判空和默认值时,不要再写 if-else 了:

// 安全判空
ObjectUtils.isEmpty(obj);

// 获取第一个非空对象
ObjectUtils.firstNonNull(obj1, obj2, defaultValue);

// 空安全toString
ObjectUtils.nullSafeToString(obj);

3. CollectionUtils

Spring 的集合工具类让集合操作更加优雅:

// 集合判空
CollectionUtils.isEmpty(collection);

// 查找第一个匹配元素
CollectionUtils.find(collection, predicate);

// 合并数组
CollectionUtils.mergeArrayIntoCollection(arr, collection);

二、HTTP 请求

1. RestTemplate传统同步请求

虽然已被标记为过时,但在非响应式项目中依然实用:

// 简单GET请求
String result = restTemplate.getForObject(url, String.class);

// 带参数的POST请求
ResponseEntity<String> response = restTemplate.postForEntity(
    url, request, String.class);

2. WebClient

Spring 5 引入的响应式 HTTP 客户端:

WebClient.create()
    .get()
    .uri(url)
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(result -> System.out.println(result));

3. TestTemplate

专门为测试设计的增强版 RestTemplate:

@Test
public void testApi() {
    ResponseEntity<String> response = testRestTemplate
        .getForEntity("/api/test", String.class);
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}

4. MockRestServiceServer

测试时模拟外部 API 调用:

MockRestServiceServer server = MockRestServiceServer
    .bindTo(restTemplate).build();

server.expect(requestTo("/external/api"))
    .andRespond(withSuccess("mock response", MediaType.APPLICATION_JSON));

三、缓存 & 异步

1. CacheManager

Spring 的缓存抽象层支持多种实现:

@Cacheable(value = "users", key = "#id")
public User getUser(Long id) {
    // 数据库查询
}

@CacheEvict(value = "users", key = "#id")
public void updateUser(User user) {
    // 更新逻辑
}

2. @Async + TaskExecutor

轻松实现方法异步执行:

@Async
public CompletableFuture<User> asyncGetUser(Long id) {
    // 耗时操作
    return CompletableFuture.completedFuture(user);
}

// 配置线程池
@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    return executor;
}

3. EventPublishe

实现应用内事件发布订阅:

// 定义事件
public class UserRegisteredEvent extends ApplicationEvent {
    public UserRegisteredEvent(User user) {
        super(user);
    }
}

// 发布事件
applicationEventPublisher.publishEvent(new UserRegisteredEvent(user));

// 监听事件
@EventListener
public void handleEvent(UserRegisteredEvent event) {
    // 处理逻辑
}

四、校验 & 日志

1. Assert

Spring 的断言工具让参数检查更简洁:

// 参数校验
Assert.notNull(param, "参数不能为空");
Assert.isTrue(value > 0, "值必须大于0");

// 状态检查
Assert.state(isValid, "状态不合法");

2. @Validated + BindingResult

结合 JSR-303 实现参数校验:

@PostMapping("/users")
public ResponseEntity createUser(
    @Validated @RequestBody User user,
    BindingResult result) {
    
    if (result.hasErrors()) {
        // 处理校验错误
    }
    // 业务逻辑
}

3. Logback/Log4j2

SpringBoot 自动配置的日志系统:

# application.properties
logging.level.root=INFO
logging.level.com.example=DEBUG
logging.file.name=app.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

五、测试 & 调试

1. MockMvc

测试 Controller 层的利器:

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testGetUser() throws Exception {
        mockMvc.perform(get("/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("张三"));
    }
}

2. OutputCapture

捕获并验证日志输出:

@SpringBootTest
class LoggingTest {

    @Autowired
    private MyService service;

    @Rule
    public OutputCapture outputCapture = new OutputCapture();

    @Test
    void testLogging() {
        service.doSomething();
        assertThat(outputCapture.toString())
            .contains("操作已完成");
    }
}

3. TestPropertyValues

灵活修改测试环境配置:

@Test
void testWithDynamicProperties() {
    TestPropertyValues.of(
        "app.timeout=5000",
        "app.enabled=true"
    ).applyTo(environment);
    
    // 执行测试
}

4. SpringBootTest

完整的集成测试支持:

@SpringBootTest(
    webEnvironment = WebEnvironment.RANDOM_PORT,
    properties = {"app.env=test"}
)
class FullIntegrationTest {

    @LocalServerPort
    private int port;

    @Test
    void testFullStack() {
        // 测试完整应用栈
    }
}

六、冷门但实用的工具

1. BannerCustomizer

让应用启动更有个性:

@Bean
public BannerCustomizer myBannerCustomizer() {
    return banner -> {
        banner.setBanner(new ResourceBanner(
            new ClassPathResource("banner.txt")));
        banner.setMode(Banner.Mode.LOG);
    };
}

2. Environment

灵活访问环境变量和配置:

@Autowired
private Environment env;

public void someMethod() {
    String dbUrl = env.getProperty("spring.datasource.url");
    boolean debug = env.getProperty("app.debug", Boolean.class, false);
}

3. SpelExpressionParser

运行时执行 SpEL 表达式:

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("name.toUpperCase()");

String result = exp.getValue(userContext, String.class);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT枫斗者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值