文章目录
- 一、配置优先级
- 1.1 命令行设置端口号
- 1.2 打包后修改端口号
- 1.3 优先级 小结
- 二、Bean的管理
- 2.1 获取Bean
- 2.2 Bean作用域
- 2.3 第三方Bean
- 三、剖析Springboot的底层原理
- 3.1 起步依赖
- 3.2 自动配置
- 3.2.1 第三方类装配
- 3.2.2 原理分析
- 总结
- Web后端开发总结:
- 源码跟踪技巧:
一、配置优先级
配置文件优先级排名(从高到低):
- properties配置文件
- yml配置文件
- yaml配置文件
1.1 命令行设置端口号
- Java系统属性配置 (格式: -Dkey=value)
-Dserver.port=9000
- 命令行参数 (格式:–key=value)
--server.port=10010
1.2 打包后修改端口号
java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010
java -Dserver.port=9000 -jar XXXXX.jar
1.3 优先级 小结
二、Bean的管理
2.1 获取Bean
默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了。
主动从IOC容器中获取到bean对象,3种常用方式:
-
根据name获取bean
Object getBean(String name)
-
根据类型获取bean
<T> T getBean(Class<T> requiredType)
-
根据name获取bean(带类型转换)
<T> T getBean(String name, Class<T> requiredType)
测试:
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {@Autowiredprivate ApplicationContext applicationContext; //IOC容器对象//获取bean对象@Testpublic 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而言。)
注意事项:
- IOC容器中的bean默认使用的作用域:singleton (单例)
- 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)
2.2 Bean作用域
作用域 | 说明 |
---|---|
singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
prototype | 每次使用该bean时会创建新的实例(非单例) |
Spring中的@Scope注解来进行配置作用域:
注意事项:
- prototype的bean,每一次使用该bean的时候都会创建一个新的实例
- 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性
2.3 第三方Bean
声明形参,自动装配:
三、剖析Springboot的底层原理
3.1 起步依赖
starter启动器 :maven的依赖传递
3.2 自动配置
SpringBoot项目在启动时通过自动配置完成了bean对象的创建。
SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
@Configuration底层包括service/controller…都是@Component
3.2.1 第三方类装配
自动装配需要满足:
- 添加注解
- 注解被spring的组件扫描到
如果需要使用第三方类,除了添加注解,也要确保注解会被扫描到:
- 方案1:@ComponentScan 组件扫描
- 方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)
- 方案1:
@ComponentScan
:
@SpringBootApplication
@ComponentScan({"com.wake","com.example"}) //指定要扫描的包
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}
- 方案2:
@Import 导入
:
导入形式主要有以下几种:
- 导入普通类
- 导入配置类
- 导入ImportSelector接口实现类
- 使用第三方依赖提供的 @EnableXxxxx注解
import:
@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}
EnableXxxxx:
- 第三方依赖中提供的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig {
}
- 在使用时只需在启动类上加上
@EnableXxxxx
注解即可
@EnableHeaderConfig //使用第三方依赖提供的Enable开头的注解
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}
3.2.2 原理分析
@SpringBootApplication:
总结
Web后端开发总结:
SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。
源码跟踪技巧:
- 在跟踪框架源码的时候,一定要抓住关键点,找到核心流程。
- 一定不要从头到尾一行一行代码去看,一个一个方法的去研究,一定要找到关键流程,抓住关键点,
- 先在宏观上对整个流程或者整个原理有一个认识,有精力再去研究其中的细节。