FirstSpringBoot
1.SpringBoot简介
简化Spring应用开发的一个框架
整个Spring技术桟的整合;
j2ee开发的一站式解决方案
2.微服务
微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
2014,Martin fowler提出的一种架构风格。 一个应用应该是一组小型服务,通过HTTP的方式进行互通。每一个功能最终都是可独立替换和独立升级的软件单元。
- 单体应用:ALL IN ONE
下图展示单体应用和微服务的比较:
3.第一个SpringBoot
实现一个功能:浏览器发送一个请求,服务器接收请求并处理,响应HelloWorld字符串。
在IDEA中创建一个spring Initializr的web项目,会自动生成一个Application
/**
* @SpringBootApplication 用来标注主程序,说明是一个springboot应用
*
*/
@SpringBootApplication
public class SpringbootHelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloworldApplication.class, args);
}
}
然后创建控制层中写一个Hellocontroller类。
@RestController
public class Hellocontroller {
@RequestMapping("/hello")
public String hello() {
return "Hello world!";
}
}
这样一个最小的应用就创建出来了。感觉url的配置和Python的flask创建很像。最后访问localhost:8080/hello
4.目录结构
-
resources的目录结构:
- static:保存所有静态资源包括css,js,img
- templates: 保存所有的模板页面(SpringBoot默认jar包使用嵌入式的Tomcat,默认不支持jsp),可以使用模板引擎(freemarker,thymeleaf)
-
applacation.properties: SpringBoot默认配置文件,可以修改一些默认配置
5.部署
将应用打包成jar包,直接使用java -jar方法即可。
6.HelloWorld 探究
1.pom文件
- 父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2.启动器
- spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter : spring-boot 场景启动器;导入了web模块正常运行所依赖的组件
springboot将所有功能场景抽取出来,做成一个个starters(启动器),只需要在项目中引入这些starters相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器
3.主程序类,主入口类
/**
* @SpringBootApplication 用来标注主程序,说明是一个springboot应用
*
*/
@SpringBootApplication
public class SpringbootHelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloworldApplication.class, args);
}
}
@SpringBootApplication: SpringBoot应用标注在某个类上说明这个类是springboot主配置类,springboot应该运行这个类的main方法来启动这个应用
@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 : springboot的配置类
标注在某个类上,表示这是一个springboot配置类
- @Configuration:配置类上标注这个注解
配置类是spring的配置文件,也是容器中的一个组件 @Component
- @Configuration:配置类上标注这个注解
@EnableAutoConfiguration: 开启自动配置功能。使用注解,告诉SpringBoot开启自动配置功能,无需我们自己配置。
@AutoConfigurationPackage : 自动配置包
- @Import({Registrar.class}):Spring 的底层注解,给容器导入一个组件
将主配置类(@SpringBootApplication 标注的类)的所在包下面的所有子包里面的所有组件扫描到Spring的容器中
@AutoConfigurationPackage @Import({EnableAutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
- @Import({Registrar.class}):Spring 的底层注解,给容器导入一个组件
@Import({EnableAutoConfigurationImportSelector.class}):给容器导入组件
需要导入哪些组件呢?
EnableAutoConfigurationImportSelector.class 将所需要导入的组件已全类名的方式返回;这些组件就会被添加到容器中;
给容器导入非常多的自动配置类(XXXAutoConfiguration);给容器中导入这个场景需要的所有组件,并配置好这些组件
- 有了自动配置类,免去了我们手动编写配置注入功能组件等工作
- SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, this.beanClassLoader);
- SpringBoot在启动时从类路径下的META-INF/spring.factories获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类帮我们做了。
- j2ee的整体整合解决方案和自动配置都配好了如下图