SpringBoot2版本的@Configuration注解的源码详解

         ​​​这周开始对SpringBoot2源码的学习呢,突发奇想,要记录一下自己的学习经历,下面是对@Configuration注解的说明

@Configuration注解说明

        @Configuration作用:表明一个类中声明一个和多个@Bean标记的方法,并且这些方法被Spring容器管理用于生成Bean定义以及在运行时这些Bean的服务请求。

        简单来说,就是将@Configuration下的类和@Bean下的方法当作组件,将这些组件放入Spring容器中,并随着项目启动时启动。

        当然,这时我们有必要介绍一下spring在xml文件下的写法和SpringBoot2中的写法:

spring中在xml文件中的的写法:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmls="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org">
    
    <bean id="user" class="com.example.user">
        <property name="name" value="菜菜"></property>
    </bean>
</beans>

SpringBoot2使用注解的写法:

@Configuration
public class HelloConfig {
//@Bean注解中加上自定义的名字用来修改此组件名
    @Bean
    public User getUser(){
        return new User("菜菜");
    }
}

单实例

       首先介绍一下什么是单实例和多实例:即Spring容器创建该组件时是创建一个还是多个对象。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

        上面讲了SpringBoot2创建组件的方法,但@Configuration源码(如上)中还有一个默认返回为true的方法 proxyBeanMethods()

        该方法是为了告诉Spring容器此组件是单实例还是多实例,我们可以来验证一下,验证代码如下,在SpringBoot启动类中执行:

        ConfigurableApplicationContext run = SpringApplication.run(SpringbootYuanmaApplication.class, args);
        //获取Bean对象
        User userOne_1 = run.getBean("userOne",User.class);
        User userOne_2 = run.getBean("userOne", User.class);
        //判断对象是否相同
        boolean b=userOne_1==userOne_2;
        System.out.println("两组件是否相同:"+b);

运行结果如下:

 由此可见,当不做对@Configuration做任何配置时,Spring容器是单实例的。

@Configuration(proxyBeanMethods = true)为代理对象调用方法,SpringBoot总会检查这个组件,并保持此组件单实例

多实例

       @Configuration注解改成@Configuration(proxyBeanMethods = false)即可将此类中的组件改为多实例。

       经过对单实例的介绍,我觉得多实例应该不成问题了,在此就简单总结一下单实例与多实例。

    

proxyBeanMethods = true单实例调用时会去容器中找组件
proxyBeanMethods = false多实例不会保留代理模式,每次调用会产生新的对象

全配置Full(proxyBeanMethods = true)和轻量级配置Lite(proxyBeanMethods = false)

Full配置,可以很好的处理组件依赖,组件依赖就是一个组件中引用了另一个组件

Lite配置,SpringBoot不会去检查容器中是否有此组件,启动就会非常快、

第二次写文章

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值