Spring Bean 被提前创建,导致 BeanPostProcessor 对其失效
问题
在一个 Spring Boot 项目中,我们集成了 Shiro 权限框架,在我们实现 AuthorizingRealm 的 UserRealm 类中,通过 @Autowired
注解注入了一个 LoginService 类,用于获取用户信息。
LoginService 中有使用自定义注解用于在 Bean 实例化阶段获取配置信息。通过 BeanPostProcessor 实现的。但 LoginService 在实例化的使用,没有被 BeanPostProcessor 增强。
@Configuration
public class ShiroConfiguration {
@Bean
public UserRealm userRealm() {
UserRealm userRealm = new UserRealm();
return userRealm;
}
}
@Slf4j
public class UserRealm extends AuthorizingRealm {
@Autowired
private LoginService loginService;
}
@Service
public class LoginServiceImpl implements LoginService {
@Config("prefix")
private String prefix;
}
原因
UserRealm 是通过 @Configuration
+ @Bean
的方式注入到 Spring 容器中的。通过这种方式创建的 UserRealm 实例时,会导致 UserRealm 依赖的 LoginService 实例被提前创建,从而导致 BeanPostProcessor 对其失效。
解决
通过 @Lazy
注解,延迟 LoginService 实例的创建。
@Slf4j
public class UserRealm extends AuthorizingRealm {
@Lazy
@Autowired
private LoginService loginService;
}