Spring 使用注释重写Bean配置
用例:我通过classpath scanning@ComponentScan配置了容器。对于我的测试配置,我需要模拟特定bean的能力 由于加载顺序的原因,在使用@Configuration时,通过类路径扫描加载的bean没有正确覆盖。下面的代码示例演示了该问题。java展示了如何通过配置覆盖bean。java显示跳过重写通过@ComponentScan加载的bean(参见最后一条注释) 演示项目可在上获得 输出: 21:05 INFO | com.glassworks.mock.BaseExample | accountDao:mock for accountDao,hashCode:666537607Spring 使用注释重写Bean配置,spring,annotations,classpath,overriding,spring-annotations,Spring,Annotations,Classpath,Overriding,Spring Annotations,用例:我通过classpath scanning@ComponentScan配置了容器。对于我的测试配置,我需要模拟特定bean的能力 由于加载顺序的原因,在使用@Configuration时,通过类路径扫描加载的bean没有正确覆盖。下面的代码示例演示了该问题。java展示了如何通过配置覆盖bean。java显示跳过重写通过@ComponentScan加载的bean(参见最后一条注释) 演示项目可在上获得 输出: 21:05 INFO | com.glassworks.mock.BaseExa
[// ScanExample.java
package com.glassworks.mock;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.google.common.base.Joiner;
public class ScanExample {
private static final Logger log = LoggerFactory.getLogger(ScanExample.class);
private static AnnotationConfigApplicationContext ctx;
public static void main(String args[]) {
ctx = new AnnotationConfigApplicationContext(Config.class, OverrideConfig.class);
String beans[] = ctx.getBeanDefinitionNames();
log.info("{} beans found: {}", beans.length, Joiner.on(",").join(beans));
for(String bean : beans) {
log.info("{}: {}", bean, ctx.getBean(bean));
}
}
@Configuration
@ComponentScan("com.glassworks.services")
public static class Config {
}
@Configuration
public static class OverrideConfig {
@Bean
public AccountDao accountDao() {
log.debug("Creating accountDao [OverrideConfig]");
return Mockito.mock(AccountDao.class);
}
}
}
输出:
21:08信息| com.glassworks.mock.ScanExample | accountDao:com.glassworks.services。AccountDao@48805ebb
// AccountDao.java
package com.glassworks.services;
import org.springframework.stereotype.Repository;
@Repository
public class AccountDao {
}
注意
值得注意的是,当日志设置为debug时,Spring表示它跳过了定义。这似乎是一个bug
21:09调试| o.s.c.a.ConfigurationClassBeanDefinitionReader |跳过加载[BeanMethod:name=accountDao,declaringClass=com.glassworks.mock.ScanExample$OverrideConfig]的bean定义:bean“accountDao”的定义已存在。这可能是由于XML中的覆盖。您的问题是“这是一个bug吗?”?这是一种bug。看看你是怎么解决的?
// AccountDao.java
package com.glassworks.services;
import org.springframework.stereotype.Repository;
@Repository
public class AccountDao {
}