一个功能:
浏览器发送hello请求,服务器接收请求并处理,响应hello World字符串。
1.创建一个maven工程;(jar)
2.导入依赖spring boot相关的依赖
首先它继承了一个父项,然后是web模块的一个依赖
3.编写主程序;
@SpringBootApplication
来标注一个主程序类(MainApplication),
说明这是一个Spring Boot应用(Application)
SpringApplication.run(MainApplication.class,args);
spring应用启动起来
@SpringBootApplication
public class HelloWordMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWordMainApplication.class,args);
}
4.编写Controller
能处理请求,加个@Controller注解。
能处理什么请求呢,加个@RequestMapping注解。
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
5.主程序类里面,运行Main方法
不用整合服务器。
以前要把整个应用打包成war包,然后部署在tomcat服务器上。
6.简化部署,导入Maven插件
maven 插件 可以将应用打包成一个可执行的jar包。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
</plugin>
</plugins>
</build>
直接java -jar的命令进行执行
打包携带上了tomcat服务器。
7. Hello World 探究
1.POM文件 (导入了相关依赖)
1.父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
他的父项目是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
他来真正管理Spring Boot应用里面的所有依赖版本
以后我们导入依赖默认是不需要声明版本号;
没有在dependencies里面管理的依赖自然需要声明版本号。
2.导入的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
没有声明版本号
</dependencies>
spring-boot-starter-web:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件
Spring Boot 将所有的功能场景都抽取出来,做成一个个的starters (启动器)
只需要在项目里面引入starter,相关场景的所有依赖的组件都会导入进来。
3.主程序类
@SpringBootApplication
public class HelloWordMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWordMainApplication.class,args);
}
}
@SpringBootApplication:Spring Boot应用,标注在主程序类上
Spring Boot就应该运行这个主程序类的main方法,来启动SpringBoot应用。
@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 {
@SpringBootConfiguration:Spring Boot的配置类;
标注在某个类上,表示这个一个Spring Boot的配置类;
@Configuration:Spring的配置类
配置类也是容器中的一个组件;@Component
@EnableAutoConfiguration: | 告诉Spring Boot,开启自动配置功能; |
---|---|
@AutoConfigurationPackage: | 自动配置包, 将主配置类(@SpringBootAppliacaiton标注的类)的所有包及所有子包里面的所有组件扫描到Spring容器。 |
@Import(AutoConfigurationPackages.Registrar.class) | Spring的底层注解@Import,给容器中导入一个组件; 导入的组件有这个类AutoConfigurationPackages.Registrar.class |
@Import(AutoConfigurationImportSelector.class) | 给容器导入一个组件AutoConfigurationImportSelector:导入哪些组件的选择器,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。 |
会给容器中导入非常多的自动配置类(xxxAutoConfiguration);
就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
有了自动配置类,免去了手动编写配置注入功能组件等的工作。
SpringFactoriesLoader.loadFactoryNames( EnableAutoConfiguration.class,getBeanClassLoader());
Spring Boot在启动的时候从类路径下的"META-INF/spring.factories"中获取EnableAutoConfiguration的指定值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;
以前我们需要自己配置的东西(视图解析器),自动配置类都帮我们;
将这些值作为自动配置类(XXAutoConfiguartion)导入到容器中
J2EE的整体整合方案和自动配置都在spring-boot-autoconfigure