SpringBoot-基本原理(配置文件的优先级、Bean管理、自动配置原理)

发布时间:2024年01月01日

简介:SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要是介绍了Java项目的配置文件的优先级、Bean管理、自动配置原理。

目录

1、配置优先级

1.1 配置文件

1.2 属性配置

2、Bean管理

2.1 获取bean

2.2 bean作用域

2.3 第三方bean

3、总结


1、配置优先级

1.1 配置文件

已知SpringBoot中支持三种配置文件:下面是探究三种不同的配置文件优先级。

图1-1 配置优先级

在上面的图片中,各个配置文件的优先级如下:Properties > yml > yaml。

虽然SpringBoot支持多种格式的配置文件,但是在项目开发时,推荐使用一种格式的配置文件(yml是主流)。

1.2 属性配置

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

图 1.2-1 属性配置
图 1.2-2 属性配置步骤

2、Bean管理

2.1 获取bean

  • 默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
    • 根据name获取bean:Object getBean(String name)
    • 根据类型获取bean:<T> T getBean (Class<T> requiredType)
    • 根据name获取bean(带类型转换):<T> T getBean ( String name ,Class<T> requiredType)
package com.itheima;

import com.itheima.controller.DeptController;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;

@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);
    }
}
代码中的?ApplicationContext 就是 Spring 项目中的IOC容器,所有的bean对象都存储在里面。但是还是有注意事项(如下图)

2.2 bean作用域

Spring的bean对象支持五种作用域,后三种在Web环境下才生效,现在开发中主要是使用前两种:

图 2.2-1 bean作用域

可以通过@Scope注解来进行配置作用域:

package com.itheima.controller;

import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import java.util.List;


@Lazy //延迟初始化,只有在此对象第一次被访问的时候创建Bean对象
@Scope("prototype")
@RestController
@RequestMapping("/depts")
public class DeptController {

    @Autowired
    private DeptService deptService;

    public DeptController(){
        System.out.println("DeptController constructor ....");
    }

    @GetMapping
    public Result list(){
        List<Dept> deptList = deptService.list();
        return Result.success(deptList);
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id)  {
        deptService.delete(id);
        return Result.success();
    }

    @PostMapping
    public Result save(@RequestBody Dept dept){
        deptService.save(dept);
        return Result.success();
    }
}

代码中 @Scope("prototype") 注解作用是每一次调用类对象,都会创建一个新的Bean对象。

图 2.2-2? @Scope("prototype") 注解测试

执行图片中的测试代码,我们能看到循环创建10次 DeptController 的类对象,输出的类对象地址是不同的。

2.3 第三方bean

  • 如果要管理的bean对象来自第三方(不是自定义的),是无法用@Component及其衍生注解声明bean的,就需要用到@Bean注解。
  • 若要管理第三方bean对象,建议对这些bean进行集中分类处理,可以通过@Configuration注解声明一个配置类。
图 2.3-1 第三方bean对象

在上图中首先是在pom.xml中引入Dom4j的依赖,之后是在配置类中通过@Bean注解处理第三方类,交给IOC容器处理。(代码的详细功能已经做好了注释)

图 2.3-2 第三方bena总结

3、总结

以上就是关于Spring的配置相关知识点以及第三方Bean对象的作用,希望大家给个点赞、留言和关注。

文章来源:https://blog.csdn.net/Wang_ning__/article/details/135308873
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。