概述:我使用的是IDEA,第一次创建没有使用Spring 初始化。
1 快速创建工程
- 在 IDEA上新建一个空的jar类型 的 maven 工程
- 选中Module
- 选择jdk版本
- 确定工程名和坐标名
groupid和artifactId被统称为“坐标”是为了保证项目唯一性,maven仓库中依靠这两个属性来确定项目。
- GroupId:项目组织的唯一标识符,在实际开发中对应JAVA的包的结构,就是main目录里java的目录结构,开头以cn、com、org。
- ArtifactId:项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称;
- 填写项目名和路径,尽量保持工程在同一目录下。
修改pom文件
- 在pom.xml文件中添加Spring Boot的相关父级依赖,spring-boot-starter-parent 是一个特殊的starter,它 提供了项目相关的默认依赖,使用它之后 ,常用的包依赖可以省去 version 标签。
- 在dependencies中添加构建WEN项目所需要的依赖。
想要查看,Ctrl+选中即可
<!--
spring-boot-starter-parent : 是当前项目的父依赖
spring-boot-starter-parent 继承 spring-boot-dependencies
spring-boot-dependencies 里面定义了很多组件版本号,我们引用对应依赖时,不需要写<version>标签
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<!--spring-boot-starter-web
spring-boot-starter-web
spring-boot-starter : 它是SpringBoot的场景启动器,它针对不同场景定义了很多不同的场景启动器,
你的项目需要使用哪些场景启动器,则直接依赖对应的启动器就可以了.
-->
<!--spring-boot-starter-web 构建WEb项目, 比如:tomcat springmvc-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 我们会惊奇地发现,我们的工程自动添加了好多好多jar包, 这些 jar包正是开发时需要导入的jar包
创建控制器Controller
- 注解
Controller:处理http请求。至于后来的RestController相当于之前的@Controller加上@ResponseBody的组合,Spring4之后的注解,返回json的需要。
RequestMapping:配置url映射,后面可以?添加参数进行传递。
@Controller
public class InitController {
@ResponseBody
@RequestMapping("/hello")
public String init(){
return "hello ------";
}
}
创建引导类
- 主要作用是作为启动 Spring Boot 项目的入口
注解
/**
*
* @SpringBootApplication 用于标识 一个引导类,说明当前是一个 SpringBoot项目。主要有三个注解构成
* @SpringBootConfiguration
* @Configuration 定义配置类, 等价于配置文件
* @Component 添加到spring容器中,表示 是一个组件
*
* @EnableAutoConfiguration
* @AutoConfigurationPackage 将引导类所在包及其子包下面所有的组件添加 到spring 容器中
* @Import({AutoConfigurationImportSelector.class})
* 1. 将所有组件以全类名的方式返回,并且添加到spring 容器中
* 2. 给容器中导入自动配置类(**AutoConfiguration),无需手动编写配置注入到组件
* @ComponentScan 被该注解标识的类,会被spring容器进行管理.
*/
详情
AutoConfigurationPackage标注用@Import({Registrar.class})
// 扫描类的完整包,并放进metadata里面进行传递。
//断点调试
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
Import({AutoConfigurationImportSelector.class})重点AutoConfigurationImportSelector
/*将组件以全类名的形式扫描到Spring容器中,包括许多自动配置类,断点进行调试,查看configurations 参数
*/
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
/*
查看类是怎样加载,深层次getCandidateConfigurations,里面会有一个loadFactoryNames,
*/
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)
{
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
/*
loadFactoryNames加载工厂,里面的loadSpringFactories进行加载
同时也就是说你需要那些自动配置类,也可以在这里进行配置。
*/
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}
/*
下面是loadSpringFactories一部分 方法体内会显示具体加载路径,资源文件META-INF/spring.factories,这个架包在引入Spring是已经被引入。
在此文件中配置的所有自动配置类都会被进行扫描
*/
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
/*
文件spring.factories中的EnableAutoConfiguration对应注解
*/
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
文件截图
实验代码
@SpringBootApplication
public class HelloMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloMainApplication.class, args);
}
}
直接访问:
localhost:8080/hello