文章目录
springBoot
配置优先级
优先级从低到高
- application.yaml
- application.yml
- application.properties
- java系统属性(-Dxxx=xxx)
- 命令行参数(–xxx=xxx)
打包项目并运行
- 执行maven打包指令package
- java -xxx -jar 包名 --xxx
bean的管理
bean的获取
默认情况,spring项目启动,会把bean都创建并放在IOC容器中,
可通过以下方法主动获取bean
@Autowired
private ApplicationContext applicationContext;
@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的作用域
- @Scope(“singleton”),默认情况,容器启动时,bean被创建,可以使用@Lazy延迟初始化
- @Scope(“prototype”),每一次使用都会创建一个新的实例对象
第三方bean
IOC容器的一个好处是,可以防止bean的重复创建,浪费计算机资源
所以需要将一些用到的第三方bean放入IOC容器
项目中自定义的用@Component
引入第三方的,用@Bean注解
springBoot原理
面试高频
spring frame,需要导入的依赖繁琐,入手难
spring boot,提供了起步依赖,然后根据maven的依赖传递该有的就全都有了
自动配置
自动配置就是spring容器启动后,一些配置类\bean对象就自动存入了IOC容器,不需要手动声明
方案一:@ComponentScan组件扫描
@ComponentScan({"com.itheima","com.exxample"})
//定义在当前依赖包中
方案二:@Import导入
@Import({TokenParser.class})
//可导入普通类\配置类(封装了普通类)\ImportSelector接口实现类(按照ImportSelector接口封装了普通类)
@EnableXxxx注解,在依赖中定义注解,注解中封装了@Import注解
//现在用的方式,也更加方便,让依赖决定提供哪些普通类,不用自己(做项目的人)再去一个一个找了,在项目中声明这个@EnableXxxx注解就好了
源码跟踪
step1
@SpringBootApplication,springboot中最重要的注解,在启动类中
step2
@SpringBootConfiguration,声明当前是配置类
@EnableAutoConfiguration,实现自动化配置的核心注解(转step3)
@ComponentScan,组件扫描扫描当前引导类所在包及子包
step3
@Import(AutoConfigurationImportSelector.class),引入@bean的配置类
@Conditional
@ConditionalOnClass({Gson.class}),当前环境存在指定的这个类才声明该bean
@ConditionalOnMissingBean,当不存在当前类型的bean,才声明该bean
@ConditionalOnproperty(name=“name”,havingValue=“itheima”),配置文件(application.yml)中存在对应的属性和值,才注册bean到IOC容器中
@AutoConfiguration
@ConditionalOnClass({Gson.class})
@EnableConfigurationProperties({GsonProperties.class})
@ConditionalOnproperty(name="name",havingValue="itheima")
public class GsonAutoConfiguration {
public GsonAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public GsonBuilder gsonBuilder(List<GsonBuilderCustomizer> customizers) {
GsonBuilder builder = new GsonBuilder();
customizers.forEach((c) -> {
c.customize(builder);
});
return builder;
}
@Bean
@ConditionalOnMissingBean
public Gson gson(GsonBuilder gsonBuilder) {
return gsonBuilder.create();
}
自定义起步依赖
在实际项目开发中,可能要用到很多的起步依赖,但是springboot起步依赖并不提供,为了免去之后项目开发时,还要重新编写或重新多次引入依赖,或者为了使用要写繁琐的代码,需要自定义
- 创建aliyun-oss-spring-boot-start(依赖管理)模块
- 创建aliyun-oss-spring-boot-autoconfiguration中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxx.imports(自动配置)模块,在starter中引入该模块
- 在aliyun-oss-spring-boot-autoconfiguration中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxx.imports
web后端开发总结
两张图片
Maven高级
分模块设计
将项目按照功能拆分为若干个子模块,方便项目的管理维护,扩展,也方便模块间的相互调用,资源共享
pojo\utils直接封装在一个模块中,使用时直接引用就行,不然在每个模块中都要重复定义,冗余,影响性能
继承-继承关系
- 创建maven模块tlias-parent,为父工程,设置打包方式为pom
- 在子工程的pom.xml文件中配置继承关系
- 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)
原理类似于类的继承(继承\重写)
继承-版本锁定
就是将版本信息放在一起,方便管理
<properties>
<lombok.version>1.9</lombok.version>
</properties>
统一管理依赖版本,只管理子工程版本,还需要子工程引入所需依赖,
使用场景,当一些子工程需要某依赖,另一些不需要,就不在父工程配置依赖,只在父中管理版本,便于管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
面试题
和的区别
直接依赖,配置依赖就能在所有子工程用
管理依赖版本,还需要在子工程引入依赖
聚合
父工程就是聚合工程
按聚合打包可以一键实现
<modules>
<module>../tlias-pojo</module>
<module>../tlias-utils</module>
<module>../tlias-web-management</module>
</modules>
打包时,如果不写上面代码在父工程打包,会很麻烦
自己定义的模块开始是不存在于依赖库中的,比如打包tlias-web-management,需要查看其需要什么依赖,结果需要tlias-pojo和tlias-utils两个依赖,所以要先将tlias-pojo和tlias-utils打包放到依赖库,再打包tlias-web-management,麻烦
私服
特殊的远程仓库(公司内部),架设在局域网中,用来代理外部的中央仓库(全球的),解决团队内部的资源共享
release(发行版本),稳定的版本
snapshot(快照版本),尚处于开发的版本
需要掌握资源的上传和下载