spring @Configuration @Bean用法

Posted QQ_851228082

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring @Configuration @Bean用法相关的知识,希望对你有一定的参考价值。

概要

@Configuration里边定义@Bean,@Configuration相当于一个xml配置文件,@Bean就是xml中的<bean/>

定义

bean依赖可以调用方法,比如这里的beanTwo()。你可能会好奇,如果beanTwo()被调用两次会不会创建两个beanTwo实例,因为spring bean的默认scope是单例;答案是不会创建多个实例的,@Configuration类实现原理是cglib,代理类继承了配置类,然后重写方法,从而实现拦截,这也是为什么配置类不能被final修饰。

@Configuration
public class AppConfig {

    @Bean
    public BeanOne beanOne() {
       //bean依赖,直接调用本类方法beanTwo
        return new BeanOne(beanTwo());
    }

    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

如果跨@Configuration怎么办?将依赖bean当做方法参数传递,无论是否同一个类都可以使用这种方式,实践中这种用法更实用

@Configuration
public class AppConfig1 {

    //bean依赖,方法参数当作依赖
    @Bean
    public BeanOne beanOne(BeanTwo  beanTwo) {
        return new BeanOne(beanTwo);
    }
}
@Configuration
public class AppConfig2 {
    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

注意

如果@Bean方法返回的是BeanPostProcessor,方法要用static修饰,否则可能造成@Configuration中的@AutoWired、@Inject没被注入,因为很有可能AutoWiredBeanPostProcessor在@Configuration实例化之后执行。这是为什么呢?
这是因为static方法的BeanPostProcessor实例化时,不需要实例化@Configuration类,相当于执行ConfigurationClass.staticMethod();
而非static方法,依赖@Configuration类实例,相当于new ConfigurationClass().notStaticMethod();总

以上是关于spring @Configuration @Bean用法的主要内容,如果未能解决你的问题,请参考以下文章

No cache manager could be auto-configured, check your configuration (caching type is ‘CAFFEINE‘)

No cache manager could be auto-configured, check your configuration (caching type is ‘CAFFEINE‘)

No cache manager could be auto-configured, check your configuration (caching type is ‘CAFFEINE‘)(代码片

ImageLoader must be init with configuration before using

configure: error: XML configuration could not be found

Configuration server couldn't be contacted: D-BUS