spring @Configuration @Bean用法

本文介绍Spring框架中如何通过@Configuration和@Bean进行Bean依赖配置。详细解释了@Bean方法的调用方式及其实现原理,并展示了如何在不同@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();总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值