Spring@EnableCaching和@Inject/@Autowired问题

Spring@EnableCaching和@Inject/@Autowired问题,spring,caching,autowired,inject,Spring,Caching,Autowired,Inject,在@Configuration class中将@EnableCaching注释与@Inject/@Autowired一起使用时,我发现了一个问题: @Configuration @EnableCaching public class CacheConfig { @Inject private DataSource dataSource; @Bean public CacheManager cacheManager(){ SimpleCacheM

在@Configuration class中将@EnableCaching注释与@Inject/@Autowired一起使用时,我发现了一个问题:

@Configuration
@EnableCaching
public class CacheConfig {

    @Inject
    private DataSource dataSource;

    @Bean
    public CacheManager cacheManager(){
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("books")));
        return cacheManager;
    }

    @Configuration
    static class DevProfileConfig {
        @Bean(destroyMethod = "shutdown")
        public DataSource dataSource() {
            EmbeddedDatabaseFactory factory = new EmbeddedDatabaseFactory();
            factory.setDatabaseType(EmbeddedDatabaseType.HSQL);
            return factory.getDatabase();
        }
    }
}
复制的简单示例:

配置类:

@Configuration
@EnableCaching
public class CacheConfig {

    @Inject
    private DataSource dataSource;

    @Bean
    public CacheManager cacheManager(){
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("books")));
        return cacheManager;
    }

    @Configuration
    static class DevProfileConfig {
        @Bean(destroyMethod = "shutdown")
        public DataSource dataSource() {
            EmbeddedDatabaseFactory factory = new EmbeddedDatabaseFactory();
            factory.setDatabaseType(EmbeddedDatabaseType.HSQL);
            return factory.getDatabase();
        }
    }
}
应用程序上下文启动器:

public class CacheConfigLauncher {
    public static void main(String args[]){
        ApplicationContext springAppContext = new AnnotationConfigApplicationContext(CacheConfig.class);
    }
}
错误:

原因: org.springframework.beans.factory.BeanDefinitionStoreException: 工厂方法[public org.springframework.cache.CacheManager] spring.samples.config.CacheConfig.cacheManager()]引发异常; 嵌套异常是java.lang.IllegalArgumentException:的对象 类[null]必须是接口的实例 org.springframework.beans.factory.config.ConfigurableBeanFactory位于 org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:188) 在 org.springframework.beans.factory.support.ConstructorResolver.InstantiationUsingFactoryMethod(ConstructorResolver.java:573) ... 76多

原因:java.lang.IllegalArgumentException:类[null]的对象 必须是接口的实例 org.springframework.beans.factory.config.ConfigurableBeanFactory位于 org.springframework.util.Assert.isInstanceOf(Assert.java:339)位于 org.springframework.util.Assert.isInstanceOf(Assert.java:319)位于 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.getBeanFactory(ConfigurationClassEnhancer.java:414) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:289) 在 spring.samples.config.CacheConfig$$enhancerbyglib$$f6ceccea.cacheManager() 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:491) org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:166) ... 还有77个

但是,如果您注释掉@Inject'ed字段或@EnableCaching注释,则将引导配置,不会出现错误

这对我来说就像一只虫子。是否有人面临同样的问题,或者我可能错过了smth

谢谢,


Oleg问题已在Spring v4.0.0.M2中修复