
本文旨在讲解如何使用构造器注入来替代 Spring 框架中的 @Autowired 注解,从而实现更简洁、更易于测试的代码。我们将通过一个实际案例,展示如何利用 Lombok 提供的 @AllArgsConstructor 注解简化构造器注入的过程,并解决可能遇到的问题,最终避免手动创建 Bean。
在 Spring 框架中,依赖注入是一种核心机制,它允许我们将对象之间的依赖关系交给 Spring 容器来管理。@Autowired 注解是一种常用的依赖注入方式,但它并非唯一的选择。构造器注入是另一种更推荐的方式,它可以提高代码的可读性和可测试性。
构造器注入的优势
相比于字段注入(使用 @Autowired 注解在字段上),构造器注入具有以下优势:
- 强制依赖: 构造器注入可以确保 Bean 在创建时必须提供所有必需的依赖项,从而避免了空指针异常的风险。
- 不可变性: 通过将依赖项声明为 final,可以确保它们在 Bean 创建后不会被修改,从而提高代码的安全性。
- 易于测试: 构造器注入使得单元测试更加容易,因为我们可以直接通过构造器传递 mock 对象,而无需使用反射或其它复杂的测试技巧。
使用 Lombok 简化构造器注入
Lombok 是一个 Java 库,可以帮助我们减少样板代码。它提供的 @AllArgsConstructor 注解可以自动生成包含所有 final 字段的构造器,从而简化构造器注入的过程。
例如,假设我们有以下类:
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@AllArgsConstructor
@Component
public class AuthTokenFilter extends OncePerRequestFilter {
private final JwtUtils jwtUtils;
private final UserDetailsServiceImpl userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//method implementation
}
}在这个例子中,@AllArgsConstructor 注解会自动生成一个包含 jwtUtils 和 userDetailsService 作为参数的构造器。Spring 容器会自动识别这个构造器,并将相应的 Bean 注入到 AuthTokenFilter 中。
mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提
注意:
- 确保你的项目中已经添加了 Lombok 的依赖。
- 如果你的 Bean 只有一个构造器,Spring 会自动将其视为自动装配的构造器,即使没有显式地使用 @Autowired 注解。
- 使用 @Component 注解将 AuthTokenFilter 类声明为一个 Spring Bean。
移除手动 Bean 创建
在使用构造器注入后,通常不需要手动创建 Bean。在原始代码中,可能存在以下代码:
@Bean
public AuthTokenFilter authenticationJwtTokenFilter() {
return new AuthTokenFilter();
}这段代码是多余的,并且会导致错误,因为它没有传递任何参数给 AuthTokenFilter 的构造器。删除这段代码,让 Spring 容器自动创建和管理 AuthTokenFilter Bean。Spring 会自动发现 @Component 注解,并创建 AuthTokenFilter 实例,同时注入 JwtUtils 和 UserDetailsServiceImpl 依赖。
总结
通过使用构造器注入和 Lombok 的 @AllArgsConstructor 注解,我们可以简化 Spring 应用程序中的依赖注入,提高代码的可读性、可测试性和安全性。记住,Spring 容器会自动管理 Bean 的生命周期,因此通常不需要手动创建 Bean。









