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的文件,在里面输入什么运行之后就显示什么。