SpringBoot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,然后整合在一起,而SpringBoot抛弃了繁琐的xml配置过程,采用大量默认的配置来简化我们的spring开发过程。SpringBoot化繁为简,使开发变得更加的简单迅速。
优点
创建独立Spring应用
内嵌web服务器
自动starter依赖,简化构建配置
自动配置Spring以及第三方功能
提供生产级别的监控、健康检查及外部化配置
无代码生成、无需编写XML
SpringBoot是整合Spring技术栈的一站式框架
SpringBoot是简化Spring技术栈的快速开发脚手架
缺点
迭代快,需要时刻关注变化
封装太深,内部原理复杂,不容易精通
入门使用
相关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<!--web场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
当引入spring-boot-starter-web模块的依赖,并会引入tomcat服务器、SpringMVC等依赖
它内嵌了Tomcat并且提供了默认的配置,比如默认端口是8080.我们可以在application.properties或者application.yml中配置更改端口号
主程序
//告诉SpringBoot,这是一个SpringBoot应用
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
controller层
//@ResponseBody //返回一段话,而不是跳转到某个页面
//@Controller
@RestController //@ResponseBody与@Controller的合体
public class HelloController {
@RequestMapping("/hello") //映射请求
public String handle01(){
return "Hello,SpringBoot2"; //向浏览器返回
}
}
直接启动main方法,并访问URL: http://ip:port/hello
简单部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
把项目打成jar包,直接在目标服务器执行即可。
SpringBoot还提供了其他很多starter模块
spring-boot-starter,核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。
spring-boot-starter-jdbc,支持使用 JDBC 访问数据库。
spring-boot-starter-actuator,添加适用于生产环境的功能,如性能指标和监测等功能。
......
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
常用注解
@SpringBootApplication
定义在main方法入口类处,用于启动sping boot应用项目
@EnableAutoConfiguration
让spring boot根据类路径中的jar包依赖当前项目进行自动配置
在src/main/resources的META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
若有多个自动配置,用“,”隔开
@ImportResource
加载xml配置,一般是放在启动main类上
@ImportResource("classpath*:/spring/*.xml") 单个
@ImportResource({"classpath*:/spring/1.xml","classpath*:/spring/2.xml"}) 多个
@Value
application.properties定义属性,直接使用@Value注入即可
@ConfigurationProperties(prefix="person")
可以新建一个properties文件,ConfigurationProperties的属性prefix指定properties的配置的前缀,通过location指定properties文件的位置
@ConfigurationProperties(prefix="person")
public class PersonProperties {
private String name ;
private int age;
}
@EnableConfigurationProperties
用 @EnableConfigurationProperties注解使 @ConfigurationProperties生效,并从IOC容器中获取bean。
@RestController
组合@Controller和@ResponseBody,当你开发一个和页面交互数据的控制时,比如bbs-web的api接口需要此注解
@RequestMapping("/api2/copper")
用来映射web请求(访问路径和参数)、处理类和方法,可以注解在类或方法上。注解在方法上的路径会继承注解在类上的路径。produces属性: 定制返回的response的媒体类型和字符集,或需返回值是json对象
@RequestMapping(value="/api2/copper",produces="application/json;charset=UTF-8",method = RequestMethod.POST)
@RequestParam
获取request请求的参数值
@ResponseBody
支持将返回值放在response体内,而不是返回一个页面。比如Ajax接口,可以用此注解返回数据而不是页面。此注解可以放置在返回值前或方法前。
@Bean
@Bean(name="bean的名字",initMethod="初始化时调用方法名字",destroyMethod="close")
定义在方法上,在容器内初始化一个bean实例类。
@Service
用于标注业务层组件
@Controller
用于标注控制层组件(如struts中的action)
@Repository
用于标注数据访问组件,即DAO组件
@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@PostConstruct
spring容器初始化时,要执行该方法
@PostConstruct
public void init() {
}
@PathVariable
用来获得请求url中的动态参数
@ComponentScan
注解会告知Spring扫描指定的包来初始化Spring
@EnableZuulProxy
路由网关的主要目的是为了让所有的微服务对外只有一个接口,我们只需访问一个网关地址,即可由网关将所有的请求代理到不同的服务中。Spring Cloud是通过Zuul来实现的,支持自动路由映射到在Eureka Server上注册的服务。Spring Cloud提供了注解@EnableZuulProxy来启用路由代理。
@Autowired
在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。
当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring: 在找不到匹配 Bean 时也不报错
@Configuration
表示这是一个配置信息类,可以给这个配置类也起一个名称
@Import(Config1.class)
导入Config1配置类里实例化的bean
@Order
@Order(1),值越小优先级超高,越先运行
@ConditionalOnExpression
开关为true的时候才实例化bean
@ConditionalOnProperty
这个注解能够控制某个 @Configuration 是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。
@ConditionalOnClass
该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类
@ConditionalOnMisssingClass({ApplicationManager.class})
如果存在它修饰的类的bean,则不需要再创建这个bean;
@ConditionOnMissingBean(name = "example")
表示如果name为“example”的bean存在,该注解修饰的代码块不执行。
自动装配原理
starter场景启动器
见到很多spring-boot-starter-*:*就是某种场景
只要引入starter,这个场景的所有常规需要的依赖我们都会自动引入
SpringBoot所有支持的场景
见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
所有场景启动器最底层的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
无需关注版本号,自动版本仲裁
引入依赖默认都可以不写版本
引入非版本仲裁的jar,一定要写版本号
可以修改版本号
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
自动配置
自动配好Tomcat
引入Tmocat依赖
配置Tomcat
自动配好SpringMVC
引入SpringMVC全套组件
自动配好SpringMVC常用组件(功能)
自动配好Web常见功能,如:字符编码问题
SpringBoot帮我们配置好了所有web开发的常见场景
默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
各种配置拥有默认值
默认配置最终都是映射到MultipartProperties
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
按需加载所有自动配置项
引入了哪些场景这个场景的自动配置才会开启
SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里面
导入相关的包,相关的包中有类,@ConditionalOnClass只有有这些类,这些自动配置类才能生效
总结
SpringBoot先加载所有的自动配置类 xxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值,xxxxProperties里面拿。xxxxProperties和配置文件进行绑定
生效的配置类就会给容器中装配很多的组件,只要容器中有这些组件,相当于这些功能就有了
只要用户有自己配置的,就以用户的优先
定制化
用户直接自己@Bean替换底层的组件
用户去看组件是获取的配置文件什么值就去修改
#例如
server.servlet.encoding.charset=GBK
xxxxAutoConfiguration----->组件----->xxxxProperties里面拿值---->application.properties
dev-tools
项目或者页面修改以后:Ctrl+F9;就能实时生效
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Spring Initailizr(项目初始化向导
可以在创建项目时选择我们需要的开发场景,最后会帮我们把场景依赖引入,自动构建好项目结构,同时还会编写好主配置类