如何用Lombok构造注解替代@Autowired?遇字段初始化及Bean创建错误
用Lombok构造注解替代@Autowired的问题及解决
初始问题:Lombok构造注解替代@Autowired报错
原代码通过@Autowired注入jwtUtils(带final修饰)和userDetailsService,尝试用@RequiredArgsConstructor或@AllArgsConstructor替代@Autowired时,因final字段未初始化报错,考虑过将字段设为null但不确定合理性。
解决方案
- 移除
@Autowired并保留final修饰
Spring 4.3+版本支持无需@Autowired的构造方法注入,@RequiredArgsConstructor会自动为所有final修饰的字段生成对应的构造方法,Spring会通过该构造方法完成依赖注入。调整后的代码如下:@RequiredArgsConstructor public class AuthTokenFilter extends OncePerRequestFilter { private final JwtUtils jwtUtils; private final UserDetailsServiceImpl userDetailsService; private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class); // 其余方法保持不变 } - 不要将字段设为
null
设为null会导致后续调用jwtUtils或userDetailsService时出现空指针异常,完全不可取。
后续问题:创建Bean时报错
采用上述方案后,在Bean创建代码中出现报错:“预期2个参数,但实际传入0个”
对应的Bean创建代码:
@Bean public AuthTokenFilter authenticationJwtTokenFilter() { return new AuthTokenFilter(); }
报错原因
@RequiredArgsConstructor生成了包含两个参数(jwtUtils和userDetailsService)的构造方法,而当前@Bean方法调用的是无参构造,参数不匹配导致报错。
解决方案
修改@Bean方法,让Spring注入所需依赖并传入构造方法:
@Bean public AuthTokenFilter authenticationJwtTokenFilter(JwtUtils jwtUtils, UserDetailsServiceImpl userDetailsService) { return new AuthTokenFilter(jwtUtils, userDetailsService); }
这种方式既符合构造注入的最佳实践,也保证了依赖的不可变性,避免空指针风险。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

