一个@configuration 继承另外一个@configuration 导致bean 重复注册

我基础模块有 securityConfig

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   ......

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    ......

然后管理模块我定义mallSecurityConfig 继承 securityConfig

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MallSecurityConfig extends SecurityConfig {

    @Autowired
    private UmsAdminService adminService;
    @Autowired
    private UmsResourceService resourceService;

    @Bean
    public UserDetailsService userDetailsService() {
        //获取登录用户信息
        return username -> adminService.loadUserByUsername(username);
    }

    @Bean
    public DynamicSecurityService dynamicSecurityService() {
        return new DynamicSecurityService() {
            @Override
            public Map<String, ConfigAttribute> loadDataSource() {
                Map<String, ConfigAttribute> map = new ConcurrentHashMap<>();
                List<UmsResource> resourceList = resourceService.listAll();
                for (UmsResource resource : resourceList) {
                    map.put(resource.getUrl(), new org.springframework.security.access.SecurityConfig(resource.getId() + ":" + resource.getName()));
                }
                return map;
            }
        };
    }
}

然后提示我说passwordEncoder这个bean已经被注册了,我查了下说是两个都加了@configuration的话,继承会导致父类的bean被重复注册,这个我能理解了

但是我另外写的功能也是同样两个@configuration,几乎一样的写法,没有提示报错,这是为啥呀

img

img

我启动直接GG,spring默认beanname冲突的话,启动报错,有配置可以设置覆盖,从而启动不报错
我不知道你所谓的能启动,是你做了什么,很有可能就是楼上说的,父类就没扫描到,或者就是做了beanName相同覆盖的设置

看看你那个 configuration 有么有被容器扫到

子类

@Configuration
public class RedisCacheConfig extends BaseRedisCacheConfig {

    @Value("${spring.redis.database}")
    private Integer index;
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private Integer port;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.timeout}")
    private Long timeout;
    @Value("${spring.redis.jedis.pool.max-active}")
    private Integer maxActive;
    @Value("${spring.redis.jedis.pool.max-wait}")
    private Long maxWait;
    @Value("${spring.redis.jedis.pool.max-idle}")
    private Integer maxIdle;
    @Value("${spring.redis.jedis.pool.max-idle}")
    private Integer minIdle;

    @Override
    public BaseRedisProperties redisProperties() {

        return BaseRedisProperties.builder()
                .index(index)
                .host(host)
                .port(port)
                .password(password)
                .timeout(timeout)
                .maxActive(maxActive)
                .maxIdle(maxIdle)
                .maxWait(maxWait)
                .minIdle(minIdle)
                .build();

    }
}

父类

@EnableCaching
@Configuration
@Slf4j
public abstract class BaseRedisCacheConfig extends CachingConfigurerSupport {
    //配置redis连接属性
    public abstract BaseRedisProperties redisProperties();

    /**
     * 通过redisProperties构建连接
     * @return
     */
    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
       ......
    }
    /**
     * 配置cacheManager
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
        ......
    }

    /**
     * 配置redisTemplate<String,Object>序列化
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        ......
    }
}
# 注册bean的时候允许重名覆盖
spring:
  main:
    allow-bean-definition-overriding: true