如何复用@PostConstruct方法避免代码重复?解决Mapper空指针问题
问题分析与解决方案
首先看你的代码,核心问题在于你把Spring Bean的管理和工厂模式混用了,且未正确处理依赖注入:
- 你的
RepoService已经标注了@Service和@Qualifier,说明它本身就是Spring容器管理的Bean,完全不需要通过RepoFactory手动获取实例——Spring会自动完成注入,这才是依赖注入的正确用法。 - Mapper里出现空指针,是因为你既没给
repoService加注入注解,又强行复用Service类的@PostConstruct逻辑,但此时RepoFactory可能还未完成初始化,或者Mapper的初始化顺序早于Factory,导致调用factory.getRepositoryService()拿不到实例,最终repoService为空。
修正步骤
步骤1:简化Service类,直接注入RepoService
既然RepoService是Spring Bean,删掉手动获取的逻辑,直接用@Autowired注入:
class Service { @Autowired @Qualifier("repoService") // 匹配RepoService的@Qualifier标识 private RepoService repoService; public void create() { repoService.createRecord(); } }
步骤2:修复Mapper类的依赖注入
Mapper里需要用RepoService,直接通过@Autowired注入即可,无需重复工厂获取逻辑:
@Component class Mapper { @Autowired @Qualifier("repoService") private RepoService repoService; public void createMapper(){ repoService.getRecord(); } }
步骤3:处理循环依赖(自动兼容)
注意到RepoService依赖Mapper,Mapper又依赖RepoService,这属于Spring的循环依赖。不过Spring默认支持单例Bean的循环依赖(通过三级缓存机制),只要你的Bean都是默认单例模式,Spring会自动处理,无需额外操作。
空指针原因解析
当你在Mapper里添加@PostConstruct方法调用工厂时,Spring Bean初始化顺序可能是:
- 先初始化Mapper,执行它的
@PostConstruct方法 - 此时
RepoFactory或RepoService还未完成Spring实例化 factory.getRepositoryService()返回null,后续调用repoService.getRecord()就会抛出空指针
额外建议
- 除非是动态创建多实例等特殊场景,否则优先用Spring依赖注入,避免手动通过工厂获取Spring Bean
- 所有需要Spring管理的类,要标注正确的注解(
@Service/@Component等),成员变量需要注入时,务必添加@Autowired(更推荐用构造器注入)
内容的提问来源于stack exchange,提问作者mathew thomas
相关产品推荐
相关产品推荐

