- 传统web项目的运行模式:工程代码打包成war包,部署到tomcat服务器中。
- SpringBoot运行模式:直接执行jar或war包。
【SpringBoot 主要有五大特性】:
- SpringApplication
- 自动装配
- 外部化配置
- SpringBoot Actuator
- 嵌入式Web容器
SpringBoot可执行JAR
前提条件:需要添加spring-boot-maven-plugin到pom.xml文件中。
用mvn package
指令将项目打包,生成jar包。
指令java -jar ***.jar
可以运行springboot项目(开发阶段使用mvn spring-boot:run
,两者效果是一样的)
java -jar运行SpringBoot项目原理分析
(打包后的jar的目录结构可以参照书本P34)
java -jar
引导的是标准可执行JAR文件,java官方规定,java -jar
命令引导的具体启动类必须配置在MANIFEST.MF资源的Main-Class属性中。
同时,根据“JAR文件规范”,MANIFEST.MF资源必须存放在/META-INF/目录中。
实际项目中我们发现Main-Class属性指向的Class为org.springframework.boot.loader.JarLauncher,并且Start-Class属性中设定了SB项目的引导类(thinkinginspringboot.firstappbygui.FirstAppByGuiApplication)。
Start-Class属性并非Java平台标准MANIFEST.MF的属性,而是spring定义的,是JarLauncher/WarLauncher用来读取SB项目的启动类的。
(JarLauncher的实现原理在书本P40-P54)
其实,通过java命令引导JarLauncher类文件,JarLauncher会在同进程内调用Start-Class类的main(String[])方法,并且在启动前准备好Class Path。
理解自动装配
- SB激活自动化装配:将@EnableAutoConfiguration或者@SpringBootApplication标注在项目中随意一个@Configuration类上。
- @SpringBootApplication的作用:激活@EnableAutoConfiguration、@Configuration、@ComponentScan三个注解的特性。
- @EnableAutoConfiguration用于激活自动装配机制
- @ComponentScan激活@Component的扫描
- @Configuration声明被标记的类为配置类
- @SpringBootApplication = @EnableAutoConfiguration + @Configuration + @ComponentScan
- @SpringBootConfiguration中的@ComponentScan并不是拿默认配置的,ta添加了一个TypeFilter的排除的实现,排除了TypeExcludeFilter.class和AutoConfigurationExcludeFilter.class.
- TypeExcludeFilter.class 用于查找BeanFactory中已注册的TypeExcludeFilter Bean,作为代理对象。
- AutoConfigurationExcludeFilter.class用于排除其他同时标注了@Configuration和@EnableAutoConfiguration的类。
从SpringBoot 1.4 开始,@SpringBootApplication 注解不在标注@Configuration,而是@SpringBootConfiguration,两者并无差异。
@SpringBootApplication 属性别名
@SpringBootApplication 注解中多次用到了@AliasFor 这个注解。
@AliasFor 能够将一个或多个注解的属性“别名”在某个注解中
上面的“别名”我理解为“附加”
例如:
@SpringBootApplication(scanBasePackages = “thinking.in.spring.boot.config”)
这个原本是@ComponentScan 的 basePackages属性
@SpringBootApplication标注非引导类
引导类:又叫启动类,用于启动SpringBoot 项目的,一般命名方式为:项目名+Application
@SpringBootApplication可以放到非引导类上,也可以达成和放到引导类上一样的效果。
SpringBoot 自动配置机制
SB中,@Configuration声明被标记的类为配置类,它们会被SB装载,即使这些配置类是在外部的jar包中。当@ConditionOnClass 也标注在这种配置类上时,那么当且仅当该类存在于ClassPath下时才会被装载。
开发者怎么自定义自动装配类?
- 在resource 目录下创建 META-INF/spring.factories 资源。
- 在 spring.factories 中配置你要装配的类:(LibXAutoConfiguration类上需要加上注解@Configuration)
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
注意:自动装配的类,一般用 AutoConfiguration作为后缀
SpringBoot Actuator
SpringBoot Actuator 用于监控和管理Spring 应用,可通过HTTP Endpoint 或JMX Bean 与其交互。
- 使用场景:监视和管理投入生产的应用。
- 监管媒介:HTTP或JMX端点。
- 端点类型:审计、健康和指标收集。
- 基本特点:自动运用。
SpringBoot Actuator Endpoints
actuator 提供了很多监管应用的endpoints(端点)。
常用端点:
- beans:显示当前Spring应用上下文的Spring Bean 完整列表(包含所有ApplicationContext的层次)。
- conditions:显示当前应用所有配置类和自动装配类的条件评估结果(包含匹配和非匹配)。
- env:暴露 Spring ConfigurableEnvironment 中的PropertySource属性。
- health:显示应用的健康信息。
- info:显示任意的应用信息。
使用:
添加Maven依赖
1
2
3
4
5
6<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在spring-boot Maven插件的启动参数中添加配置属性,暴露beans 为Web Endpoint:
1
$ mvn spring-boot:run -Dmanagement.endpoints.web.exposure.include=beans
执行请求:
$ curl http://127.0.0.1:8080/actuator/beans | json_pp
再次向spring-boot Maven插件的启动参数中添加配置属性,暴露conditions和env的Web Endpoint:
1 | $ mvn spring-boot:run -Dmanagement.endpoints.web.exposure.include=beans,conditions,env |
执行请求:$ curl http://127.0.0.1:8080/actuator/conditions| json_pp
注解
@Bean
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
@Import
@Import注解是用来导入配置类或者一些需要前置加载的类.
例子:https://blog.csdn.net/mamamalululu00000000/article/details/86711079