我基础模块有 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
,几乎一样的写法,没有提示报错,这是为啥呀
我启动直接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