一、HelloWorld 案例
1、实现功能
浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;
2、创建一个 maven 工程(jar)
3、导入 spring boot 相关的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4、编写一个主程序:启动 Spring Boot 应用
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
5、编写相关的 Controller、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping(value = "/hello")
public String hello(){
return "Hello World!";
}
}
6、运行主程序测试
7、简化部署
<!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
将这个应用打成jar包,直接使用java -jar的命令进行执行;
二、HelloWorld 探究
1、POM 文件
(1)父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
他的父项目是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
他来真正管理Spring Boot应用里面的所有依赖版本;
Spring Boot的版本仲裁中心;
以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
(2)启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、主程序类,入口类
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.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) })
public @interface SpringBootApplication {}
(1)@SpringBootConfiguration 注解
@SpringBootConfiguration:Spring Boot的配置类;
标注在某个类上,表示这是一个Spring Boot的配置类;
@Configuration:配置类上来标注这个注解;
配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component
(2)
@EnableAutoConfiguration:开启自动配置功能;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
可以看到会加载在 META-INF/spring.factories 文件作为资源,然后获取 factoryClassName(EnableAutoConfiguration) 指定的值放在容器中。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;
三、小结
1、starters
Spring Boot为我们提供了简化企业级开发绝大多数场景的starter pom(启动器),只要引入了相应场景的starter pom,相关技术的绝大部分配置将会消除(自动配置),从而简化我们开发。业务中我们就会使用到Spring Boot为我们自动配置的bean。
这些starters几乎涵盖了javaee所有常用场景, Spring Boot对这些场景依赖的jar也做了严格的测试与版本控制。我们不必担心jar版本合适度问题。
spring-boot-dependencies里面定义了jar包的版本。
2、入口类和 @SpringBootApplication
(1)程序从 main 方法开始运行;
(2)使用 SpringApplication.run() 加载主程序类;
(3)主程序需要标注 @SpringBootApplication;
(4)@EnableAutoConfiguration 是核心注解;
(5)@Import 导入所有的自动配置场景;
(6)@AutoConfigurationPackage 定义默认的包扫描规则;
(7)程序启动扫描加载主程序类所在的包以及下面所有子包的组件;
3、自动配置
xxxAutoConfiguration
Spring Boot中存现大量的这些类,这些类的作用就是帮我们进行自动配置;
他会将这个这个场景需要的所有组件都注册到容器中,并配置好;
他们在类路径下的 META-INF/spring.factories文件中;
spring-boot-autoconfigure-1.5.9.RELEASE.jar中包含了所有场景的自动配置类代码;
这些自动配置类是Spring Boot进行自动配置的精髓