最新Spring Boot 快速入门(一)(1),2024年Java笔试题总

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在这里插入图片描述

3. 添加相关模板引擎

在这里插入图片描述

4. 搭建完成,测试运行

在这里插入图片描述

SpringBoot原理分析


1. 起步依赖原理分析

在这里插入图片描述

分析spring-boot-starter-parent:

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下:

在这里插入图片描述

按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的pom.xml,xml配置如下:

在这里插入图片描述

在这里插入图片描述

从上图中我们可以看到,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了,所以起步依赖的作用就是进行依赖的传递。

2. 分析spring-boot-starter-web

启动器:为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖,我们称为启动器。spring-boot-starter-parent工程将依赖关系声明为一个或者多个启动器,我们可以根据项目需求引入相应的启动器,因为我们是web项目,这里我们引入web启动器:

org.springframework.boot

spring-boot-starter-web

在上方代码中,并没有在这里指定版本信息,因为SpringBoot的父工程已经对版本进行了管理了。SpringBoot会根据spring-boot-starter-web这个依赖自动引入的,而且所有的版本都已经管理好,不会出现冲突。接下来我们可以查看以下代码:按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,观察xml中的配置(只摘抄了部分重点配置):

<?xml version="1.0" encoding="UTF-8"?>

<project xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd” xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>

、、、、、、、、、

、、、、、、、、、、

org.springframework

spring-web

5.0.5.RELEASE

compile

org.springframework

spring-webmvc

5.0.5.RELEASE

compile

从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

2. 自动配置原理分析

使用Ctrl点击查看启动类上的注解@SpringBootApplication

//声明类是一个SpringBoot引导类

@SpringBootApplication

public class MySpringBootApplication {

//main是Java程序的入口

public static void main(String[] args){

//run方法 表示运行springboot的引导 run参数就是SpringBoot引导类的字节码对象

SpringApplication.run(MySpringBootApplication.class);

}

}

发现@SpringBootApplication其实是一个组合注解,这里重点的注解有3个:

  • @SpringBootConfiguration:声明配置类

  • @EnableAutoConfiguration:开启自动配置

  • @ComponentScan:开启注解扫描(扫描与其同级)

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(

excludeFilters = {@Filter(

type = FilterType.CUSTOM,

classes = {TypeExcludeFilter.class}

), @Filter(

type = FilterType.CUSTOM,

classes = {AutoConfigurationExcludeFilter.class}

)}

)

public @interface SpringBootApplication {

@AliasFor(

annotation = EnableAutoConfiguration.class

)

Class<?>[] exclude() default {};

@AliasFor(

annotation = EnableAutoConfiguration.class

)

String[] excludeName() default {};

@AliasFor(

annotation = ComponentScan.class,

attribute = “basePackages”

)

String[] scanBasePackages() default {};

@AliasFor(

annotation = ComponentScan.class,

attribute = “basePackageClasses”

)

Class<?>[] scanBasePackageClasses() default {};

}

@SpringBootConfiguration中的代码:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Configuration

public @interface SpringBootConfiguration {

}

通过这段代码中我们可以看出,该注解中还是应用了@Configuration这个注解。其作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,并且读取其中的配置信息。而@SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。

@EnableAutoConfiguration中的代码:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import({AutoConfigurationImportSelector.class})

public @interface EnableAutoConfiguration {

String ENABLED_OVERRIDE_PROPERTY = “spring.boot.enableautoconfiguration”;

Class<?>[] exclude() default {};

String[] excludeName() default {};

}

在@EnableAutoConfiguration注解中我们可以看到一个@Import注解,其作用是当前配置文件中引入其他配置类。这里引入了AutoConfigurationImportSelector类,在这个类中有相应的方法用来加载文件中的配置,之后@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器中,进而实现@EnableAutoConfiguration自动配置的功能。

加载的文件:(spring-boot-autoconfigure.jar/META-INF/*)

在这里插入图片描述

SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。我们在使用SpringBoot构建项目时,只需要引入所需依赖,配置部分交给了SpringBoot处理。

@ComponentScan中的代码:

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE})

@Documented

@Repeatable(ComponentScans.class)

public @interface ComponentScan {

@AliasFor(“basePackages”)

String[] value() default {};

@AliasFor(“value”)

String[] basePackages() default {};

Class<?>[] basePackageClasses() default {};

Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

String resourcePattern() default “**/*.class”;

boolean useDefaultFilters() default true;

ComponentScan.Filter[] includeFilters() default {};

ComponentScan.Filter[] excludeFilters() default {};

boolean lazyInit() default false;

@Retention(RetentionPolicy.RUNTIME)

@Target({})

public @interface Filter {

FilterType type() default FilterType.ANNOTATION;

@AliasFor(“classes”)

Class<?>[] value() default {};

@AliasFor(“value”)

Class<?>[] classes() default {};

String[] pattern() default {};

}

}

@ComponentScan注解的作用类似与<context:component-scan>标签,通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包,而我们的@ComponentScan注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。一般启动类会放在一个比较浅的包目录中。

SpringBoot的配置文件


SpringBoot是基于约定的,其中有许多配置都有默认值,而这些默认配置是可以进行覆盖的,我们可以使用application.properties或者application.yml(application.yaml)进行重新配置。

在这里插入图片描述

SpringBoot默认会从Resources目录下依次加载application.yml文件、application.yaml、application.properties文件,后加载的文件会对前面的文件进行覆盖。

在这里插入图片描述

通过application.properties配置默认端口和访问路径:

#服务器端口号

server.port=8081

#当前web应用的名称

server.servlet.context-path=/demo

application.yml配置文件:

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式(文件拓展名YML文件的扩展名.yml.yaml),YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入。YML文件是以数据为核心的,比传统的xml方式更加简洁。

语法格式:key: value,value之前必须有一个空格

yml文件中通过空格来代表属性之间的层级关系,属性前的空格个数不限定,相同缩进代表同一个级别

#普通数据的配置

name: zhangsan

#对象配置

person:

name: zhangsan

age: 18

addr: beijing

#或者:行内对象配置

#person: {name: zhangsan,age: 18, addr: beijing}

#配置数组、集合(普通字符串)

city:

  • beijing

  • tianjin

  • chongqing

  • changhai

#或者:city: [beijing,tianjin,chongqing,shanghai]

#配置数组、集合(对象数据)

student:

  • name: tom

age: 18

addr: beijing

  • name: lucy

age: 17

addr: tianjin

#或者:student: [{name: tom,age: 18,addr: beijing},{name: luck,age: 17,addr: tianjin}]

#Map配置,与对象配置一样

map:

key1: value1

key2: value2

#配置端口

server:

port: 8082

SpringBoot的属性注入


配置文件与配置类的属性映射方式

使用注解@Value映射,我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上:

application.yml配置

person:

name: zhangsan

age: 18

实体Bean代码如下:

@Controller

public class Test1Controller {

@Value(“${name}”)

private String name;

@Value(“${person.addr}”)

private String addr;

@RequestMapping(“/test1”)

@ResponseBody

public String test1(){

//获取配置文件的信息

return “name:”+name+“,addr=”+addr;

}

}

打开浏览器访问,注意路径和端口号:

在这里插入图片描述

使用注解@ConfigurationProperties映射:

通过注解@ConfigurationProperties(prefix="配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射

application.yml配置如下:

person:

name: zhangsan

age: 18

addr: beijing

实体Bean代码如下:

@Controller

@ConfigurationProperties(prefix = “person”)

public class Test2Controller {

private String name;

private Integer age;

private String addr;

@RequestMapping(“/test2”)

@ResponseBody

public String test1(){

//获取配置文件的信息

return “name:”+name+“,age=”+age+“,addr=”+addr;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public String getAddr() {

return addr;

}

public void setAddr(String addr) {

this.addr = addr;

}

}

打开浏览器访问,注意路径和端口号:

在这里插入图片描述

注意:使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法

案例:配置Druid连接池


在pom.xml中添加相关依赖:

com.alibaba

druid

1.1.6

在这里插入图片描述

1. 通过@Value使用jdbc.properties文件进行配置

在resources目录下新建一个jdbc.properties文件,并配置相关信息:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/boot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8

jdbc.username=root

jdbc.password=520992

新建一个JdbcConfig类实现注入

面试准备+复习分享:

为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

秋招|美团java一面二面HR面面经,分享攒攒人品

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

com.alibaba

druid

1.1.6

在这里插入图片描述

1. 通过@Value使用jdbc.properties文件进行配置

在resources目录下新建一个jdbc.properties文件,并配置相关信息:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/boot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8

jdbc.username=root

jdbc.password=520992

新建一个JdbcConfig类实现注入

面试准备+复习分享:

为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

[外链图片转存中…(img-n7oMTC5K-1715647929197)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值