spring boot原理——starter:

当我们使用spring boot创建项目的时候,只要在远程服务器中下载好依赖就可以,也不需要配置,原因是因为我们下载的不单纯只是依赖,可以发现创建好的项目依赖后面都带有statrer,那starter是什么呢?

starter可以理解为你所需开发环境中的一组依赖,并且这一组依赖中包含所需的应用配置。在我们开发中只需要导入相关的statrer,相关的依赖就会内置到项目中,提高代码效率。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

要注意当人工配置完之后,再次导入statrer就会消除人工配置。

spring boot原理——自动配置的过程1:

spring boot创建完成之后就会自动创建一个启动类,

@SpringBootApplication
public class SpringbootDemo1Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemo1Application.class, args);
    }
}

当运行项目的时候就运行启动类,并且启动类都会有一个 @SpringBootApplication 注解,当我们点进去就会发现有很多注解

@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}
)}
)

我们只要注意三个注解就行。@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan。

@SpringBootConfiguration:继承了Configuration,表示这个启动类也可以作为配置类使用。其实可以发现,SpringBootConfiguration就可以当成Configuration来用

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

@EnableAutoConfiguration:作用就是启动spring boot内置的自动配置功能。

@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 {};
}

@ComponentScan:当我们点进去会发发现很多东西,其实实际的作用只有一个,就是加载或者是声明spring注解的扫描范围,也就是扫描bean的。只要启动类在这个包下,就会扫描这个包下所有的内容。当我们在写项目的时候,就要注意不要把文件创建错误位置,如果吧项目创建到上级目录或者别的包下,spring就会扫描不到文件。

spring boot原理——自动配置的过程2:

启动类中不光有注解,还有一个主方法。这个主方法经过各种方法的重载和类的调用,实现一个类,

public final class SpringFactoriesLoader {
    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
    private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
    static final Map<ClassLoader, Map<String, List<String>>> cache = new ConcurrentReferenceHashMap();
}

这个类的作用就是扫描MYA-INF目录下的所有spring-factories文件,这个文件可以知道所有内置的自动配置类的路径。当spring知道自动配置类的路径之后,就会依次扫描并加载自动配置。当然这些配置不是随便加载的,你要有相应的环境,相应的依赖,他才会找到对应的配置。

spring boot原理——全局配置文件:

我们知道,spring boot提供了一个全局配置文件 application.properties(当然有可能也不叫这个名字,但是用法是一样的)它用于进行开发环境需要的spring boot中没有的配置,比如数据库的连接这种spring boot没有的配置,就需要配置。

这个全局配置文件支持两种语法配置:一种是properties键值对配置,另一种是yml语法的配置

键值对的application.properties文件:

#配置数据库的连接,格式要遵守spring boot的规则
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/take-out?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=521300


#配置包名的地址,告诉spring boot文件在哪
mybatis.mapper-locations=classpath:mappers/*Mapper.xml
mybatis.type-aliases-package=com.qfedu.springbootdemo.entity

yml的application.yml文件:

#支持 yaml 语法配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/take-out?characterEncoding=utf-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 111111

mybatis:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: com.qfedu.springbootdemo.entity

这两种配置没有优劣之分,全靠自己喜好 

我们知道spring boot内置了tomcat,默认的端口号是8080,当我们要修改端口号时,只需要在全局配置文件中加入:

#修改默认tomcat端口 server: port: 8888

修改项目名称:比如说修改为/demo1

servlet: #修改项目名称 context-path: /demo1

自定义banner: 

当我们启动spring boot应用的时候会打印一个spring图标,这个图标就是banner。如果想要改变这个图标,就在resources目录下创建一个明为banner.txt的文件,在里面输入什么运行之后就显示什么。