SpringBoot(配置优先级,Bean管理,底层原理)

目录

配置优先级

 Bean管理

获取bean

bean作用域

第三方bean

底层原理

起步依赖

自动配置原理

源码跟踪

条件装配的注解

自定义starter


配置优先级

命令行参数>java系统属性properties>yml>yaml

SpringBoot 除了支持配置文件属性配置,还支持Java系统属性命令行参数的方式进行属性配置。

1.

 Bean管理

获取bean

默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

单元测试中:

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext; //IOC容器对象

    //获取bean对象
    @Test
    public void testGetBean(){
        //根据bean的名称获取
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);

        //根据bean的类型获取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);

        //根据bean的名称 及 类型获取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }

bean作用域

作用域

说明

singleton

容器内同 名称 的 bean 只有一个实例(单例)(默认)

prototype

每次使用该 bean 时会创建新的实例(非单例)

@Lazy

public DeptController(){

sout("DeptController constructor ....");

}

//bean的作用域 
    @Test
    public void testScope(){
        for (int i = 0; i < 10; i++) {
            DeptController deptController = applicationContext.getBean(DeptController.class);
            System.out.println(deptController);
        }
    }

    @Autowired
    private SAXReader saxReader;

第三方bean

如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到 @Bean注解。

 启动类:

//声明第三方bean

@Bean       //将当前方法的返回值对象交给IOC容器管理,成为IOC容器的bean

public SAXReader saxReader(){

return new SAXReader();

}

 测试类:

/第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
        //SAXReader saxReader = new SAXReader();

        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();

        System.out.println(name + " : " + age);
    }
    @Test
    public void testGetBean2(){
        Object saxReader = applicationContext.getBean("reader");
        System.out.println(saxReader);
    }

底层原理

起步依赖

自动配置原理

springBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

 springBoot只能扫描启动类 所在包及其子包 ,扫描不到其他包

自动配置原理核心在SpringBootApplication注解上,里面底层包含3个注解,最为核心的是EnableAutoConfiguration,这个注解的底层封装了一个注解import,里面指定了一个类:ImportSelector这个接口的实现类,在实现类当中,需要去实现ImportSelector这个接口当中的一个方法selectImports,这个方法返回值代表的就是我需要将哪些类交给spring的IOC容器进行管理,此时,会读取两份配置文件AutoConfiguration.import文件当中定义的就是配置类的全类名,在这个配置类当中,我们可以通过bean注解,来声明一个一个bean对象,最终项目启动,加载配置文件当中所配置的配置类,将配置类信息封装到String类型的数组当中,最终通过import注解,将配置类全部加载到spring的IOC容器当中,交给IOC容器进行管理

                           

方式1:@ComponentScan 组件扫描(不推荐)

 方式2:@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

导入 普通类 @Import({TokenParser.class}) 

导入 配置类@Import({HeaderConfig.class})

导入 ImportSelector 接口实现类@Import({MyImportSelector.class})

@EnableXxxx注解,封装@Import注解  @EnableHeaderConfig

源码跟踪

 @SpringBootApplication

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。

该注解由三个部分组成:  

@SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。  

@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。  @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。

条件装配的注解

(在所有的配置类当中所有的bean不是全部加载到spring的IOC容器当中,里面注解开头为

自定义starter

场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值