简介:SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要是介绍了Java项目的配置文件的优先级、Bean管理、自动配置原理。
目录
已知SpringBoot中支持三种配置文件:下面是探究三种不同的配置文件优先级。
图1-1 配置优先级 |
---|
在上面的图片中,各个配置文件的优先级如下:Properties > yml > yaml。
虽然SpringBoot支持多种格式的配置文件,但是在项目开发时,推荐使用一种格式的配置文件(yml是主流)。
SpringBoot除了支持配置文件配置属性,还支持Java系统属性和命令行参数的方式进行属性配置。
图 1.2-1 属性配置 |
---|
图 1.2-2 属性配置步骤 |
---|
- 默认情况下,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对象都存储在里面。但是还是有注意事项(如下图)
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 的类对象,输出的类对象地址是不同的。
- 如果要管理的bean对象来自第三方(不是自定义的),是无法用@Component及其衍生注解声明bean的,就需要用到@Bean注解。
- 若要管理第三方bean对象,建议对这些bean进行集中分类处理,可以通过@Configuration注解声明一个配置类。
图 2.3-1 第三方bean对象 |
---|
在上图中首先是在pom.xml中引入Dom4j的依赖,之后是在配置类中通过@Bean注解处理第三方类,交给IOC容器处理。(代码的详细功能已经做好了注释)
图 2.3-2 第三方bena总结 |
---|
以上就是关于Spring的配置相关知识点以及第三方Bean对象的作用,希望大家给个点赞、留言和关注。