没想到把,SpringBoot虽然简化了开发流程,但要学的东西还有很多
1. Spring Boot简介
采用约定大于配置,简化Spring开发步骤与复杂的部署流程
快速创立可独立运行的Spring项目以及集成主流框架
嵌入式Servlet容器,无需打war包
starter自动依赖与版本控制
大量的自动配置,可修改默认值
需要xml,无代码生成,开箱即用
准生产环境的运行时应用监控
与其他框架天然集成
整合Spring技术栈的大框架
2. 入门解析
1.创建maven工程jar
2.导入父项目与依赖
<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>3.创建主程序
// 标注主程序类,说明是Springboot应用 @SpringBootApplication public class HelloWorld { public static void main(String[] args) { // 让Spring应用启动,需要传入主程序类,和其参数 SpringApplication.run(HelloWorld.class,args); } }4.编写controller
@RestController public class HelloController { @RequestMapping(value = "/hello") public String hello(){ return "hello world"; } }5.测试
来到主程序运行main方法6.打包部署(记住名字不能有空格)
<!-- 将应用打包成可执行jar包的插件,package命令 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>7.分析pom.xml
spring-boot-starter-parent:还有一个父项目spring-boot-dependencies,里面规定了依赖版本号: <属性标签s> <properties> <!-- Dependency versions --> <activemq.version>5.14.5</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.59</appengine-sdk.version> <artemis.version>1.5.5</artemis.version> <aspectj.version>1.8.13</aspectj.version> 。。。。。 </properties>8.导入的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>spring-boot-starter-web:springBoot的场景启动器,里面很多依赖如:spring-web、spring-webmvc、jackson、hibernate-validator、spring-boot-starter-tomcat、spring-boot-starter
场景启动器:将功能场景抽取出来,做成starters启动器,只要项目中导入对应的启动器,那么相关场景的依赖就会自动导入
9.主程序类,入口类
@SpringBootApplication public class HelloWorld { public static void main(String[] args) { // 让Spring应用启动,需要传入主程序类,和其参数 SpringApplication.run(HelloWorld.class,args); } }@SpringBootApplication:说明是Springboot的主配置类,那么就会运行main方法来启动应用
10.@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} )} )@SpringBootConfiguration:表示配置类,配置类也是容器的一个组件即@Component,(内部是用Spring的@Configuration)
11.@EnableAutoConfiguration:开启自动配置功能,其内部又有:
@AutoConfigurationPackage @Import({EnableAutoConfigurationImportSelector.class})12.@AutoConfigurationPackage:将主配置类@SpringBootApplication标注的类及同级下面所有子包所有子包组件扫描
内部是@Import({Registrar.class}),spring的导入组件注解,Registrar.class内部有个方法
// 注册bean的定义信息,即导组件 // metadata注解标注的原信息 public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register (registry, // 这里可以获取主配置类的上级包名 (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()); }13.@Import({EnableAutoConfigurationImportSelector.class}):
导入组件的选择器EnableAutoConfigurationImportSelector.class,内容是:
// 内部继承父类,父类中有个方法 // 将所需导入的组件以全类名的方式返回,组件会被导入容器中 // 方法内部会导入非常多的自动配置类xxxAutoConfiguration,就是导入场景所需的全部组件,并配置好 public String[] selectImports(AnnotationMetadata annotationMetadata) { XXXX }