如何在Service类中获取Bean?解决ModelMapper配置循环依赖报错
问题根因
循环依赖完全是配置类的写法错误导致的:
- 你给
ModelMapperConfig加了@AllArgsConstructor,Lombok会生成包含protected final ModelMapper mapper成员的全参构造函数,Spring初始化这个配置类实例时,必须先注入ModelMapper类型的Bean - 但
ModelMapper类型的Bean恰恰是在这个配置类的getMapper()方法里定义的,要执行这个Bean的创建逻辑,又得先把配置类实例初始化完成
两边互相等待对方完成初始化,直接形成依赖闭环,就抛出循环依赖错误。
修复方式
选任意一种改就行:
方案1:直接在@Bean方法内创建ModelMapper实例(最推荐,逻辑最清晰)
不要在配置类里提前注入ModelMapper,直接在Bean声明方法里新建实例做自定义配置:
@Configuration public class ModelMapperConfig { @Bean public ModelMapper modelMapper() { ModelMapper mapper = new ModelMapper(); // 自定义映射规则 mapper.addMappings(new PropertyMap<MerchantDTO, Merchant>() { @Override protected void configure() { skip(destination.getId()); } }); // 全局配置可以统一在这里加,比如开启私有字段匹配 mapper.getConfiguration() .setFieldMatchingEnabled(true) .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE); return mapper; } }
方案2:通过方法参数注入待配置的ModelMapper实例
如果你是引入了modelmapper的starter、Spring已经自动创建了ModelMapper实例要做扩展,就不要用配置类成员变量注入的方式,直接在@Bean方法的参数上声明依赖,Spring会在调用Bean创建方法时自动传入对应实例,不会触发配置类初始化阶段的循环依赖:
@Configuration public class ModelMapperConfig { @Bean public ModelMapper modelMapper(ModelMapper mapper) { mapper.addMappings(new PropertyMap<MerchantDTO, Merchant>() { @Override protected void configure() { skip(destination.getId()); } }); return mapper; } }
注意:永远不要在@Configuration类里通过构造器/成员变量注入当前类正在声明的同类型Bean,这种写法必然触发循环依赖。
内容的提问来源于stack exchange,提问作者WebDev1
相关产品推荐
相关产品推荐

