Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用注释重写Bean配置_Spring_Annotations_Classpath_Overriding_Spring Annotations - Fatal编程技术网

Spring 使用注释重写Bean配置

Spring 使用注释重写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

用例:我通过classpath scanning@ComponentScan配置了容器。对于我的测试配置,我需要模拟特定bean的能力

由于加载顺序的原因,在使用@Configuration时,通过类路径扫描加载的bean没有正确覆盖。下面的代码示例演示了该问题。java展示了如何通过配置覆盖bean。java显示跳过重写通过@ComponentScan加载的bean(参见最后一条注释)

演示项目可在上获得

输出: 21:05 INFO | com.glassworks.mock.BaseExample | accountDao:mock for accountDao,hashCode:666537607

[// 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 {

}