当前位置: 首页 > 知识库问答 >
问题:

Spring@EnableCaching和@Inject/@Autowired问题

孙池暝
2023-03-14

我发现了一个问题,当使用@Enable缓存批注与@Inject/@autoweld在@Configuration类:

复制的简单示例:

配置类:

@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.Bean定义存储异常:工厂方法[公共org.springframework.cache.CacheManagerspring.samples.config.CacheConfig.cacheManager()]抛出异常;嵌套异常java.lang.IllegalArgumentExc0019:对象的类[空]必须是一个实例接口org.springframework.beans.factory.config.ConfigurableBeanFactory在org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188)在org.springframework.beans.factory.support.ConstructorResolver.instantiateUSingFactorymethod(ConstructorResolver.java:573)

原因:java。lang.IllegalArgumentException:类[null]的对象必须是接口组织的实例。springframework。豆。工厂配置。组织上的可配置BeanFactory。springframework。util。明确肯定isInstanceOf(Assert.java:339)位于org。springframework。util。明确肯定isInstanceOf(Assert.java:319)位于org。springframework。上下文注释。ConfigurationClassEnhancer$BeanMethodInterceptor。位于org的getBeanFactory(ConfigurationClassEnhancer.java:414)。springframework。上下文注释。ConfigurationClassEnhancer$BeanMethodInterceptor。在spring上截取(ConfigurationClassEnhancer.java:289)。样品。配置。CacheConfig$$EnhancerByGlib$$f6ceccea。sun上的cacheManager()。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗。反思。方法在org调用(Method.java:491)。springframework。豆。工厂支持简单安装策略。实例化(SimpleInstallationStrategy.java:166)。。。还有77个

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

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

谢谢你,

奥列格

共有1个答案

聂琨
2023-03-14

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

 类似资料:
  • 本文向大家介绍@Inject和@Autowired之间的区别,包括了@Inject和@Autowired之间的区别的使用技巧和注意事项,需要的朋友参考一下 @Inject和@Autowired这两个注释都用于在应用程序中自动装配。 @Inject批注是Java 6中引入的Java CDI的一部分,而@Autowire批注是spring框架的一部分。因此,两个注释都实现相同的目的,我们可以在应用程序

  • 我正在尝试替换旧的: 由此: 因为我想使用高级缓存功能,比如不缓存空值等等。 为此,我遵循了Spring教程https://spring.io/guides/gs/caching/ 如果我没有为我的应用程序添加注释。在java中,缓存根本不起作用。 但是如果我添加EnableCaching和CacheManager bean: 我在启动时收到以下错误: Java语言lang.IllegalStat

  • 问题内容: 是否通过@Autowired自动检测到?使用@Qualifier时是否按名称进行依赖项注入?我们如何使用这些批注进行setter和构造函数注入? 问题答案: 你可以与一起使用。实际上,如果发现模棱两可的bean类型,spring会询问你是否明确选择了bean,在这种情况下,你应该提供限定符 例如在以下情况下,有必要提供一个限定词 编辑: 在Lombok 1.18.4中,最终可以避免使用

  • 问题内容: @Inject和@Resource以及@Autowired注释有什么区别? 我们什么时候应该使用它们? 问题答案: 和注释@Inject和有什么区别?@Resource@Autowired 我们什么时候应该使用它们?@Inject与@Autowire与@Resource之间的区别? @Autowired:spring专有注释(与@Inject和@Resource相反),按类型(即,通过

  • 是否使用@autowired自动检测?使用@qualifier时是否按名称进行依赖注入?我们如何使用这些注释进行setter和constructor注入?

  • 问题内容: 我怎样才能像注入的依赖,,,,等的?在我的特定情况下,我需要通过以下方式注入Spring托管的: 但是,它没有注入,而是保留了null,导致。似乎,并且t也不起作用。 如何在验证器中注入服务依赖项,以便可以访问数据库? 问题答案: 在不被注入容器管理。你需要使其成为托管bean。使用Spring ,CDI @Named或JSF 代替,以便使其成为托管bean,从而有资格进行依赖项注入。