1,SpringBoot简介
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring框架是Java平台的一种开源框架,提供有控制反转特性的容器(ioc容器),ioc旨在方便项目维护和测试,他提供一种通过Java的反射机制对Java的对象进行统一的配置和管理的方法,同时通过ioc容器管理对象的生命周期,通过扫描xml文件或类上特定Java注解来配置对象,程序员可以通过依赖查找和依赖注入来获取对象。springAop框架基于代理模式,aop框架针对模块之间的交叉点进行模块化。spring框架下的事务管理,远程访问等功能均可以通过使用SpringAOP技术实现,spring的事务管理框架为Java平台带来了一种抽象机制,使所有的事务能够与保存点一起工作,并且可以在
在 Spring 体系中,Spring Boot JPA 就是约定优于配置最佳实现之⼀,不需要关注表结构,我们约定类名即是表名,属性名即是表的字段,String 对应 varchar,long 对应 bigint,只有需要⼀些特殊要求的属性,我们再单独进⾏配置,按照这个约定我们可以将以前的⼯作⼤⼤的简化。Spring Boot 体系将约定优于配置的思想展现得淋淋尽致,⼩到配置⽂件,中间件的默认配置,⼤到内置容器、⽣态中的各种 Starters ⽆不遵循此设计规则。Spring Boot ⿎励各软件组织⽅创建⾃⼰的 Starter,创建Starter 的核⼼组件之⼀就是 autoconfigure 模块,也是 Starter 的核⼼功能,在启动的时候进⾏⾃动装配,属性默认化配置。 可以说正是因为 Spring Boot 简化的配置和众多的 Starters 才让 Spring Boot 变得简单、易⽤、快速上⼿,也可以说正是约定优于配置的思想的彻底落地才让 Spring Boot ⾛向辉煌。Spring Boot 约定优于配置的思想让Spring Boot 项⽬⾮常容易上⼿,让编程变的更简单,其实编程本该很简单,简单才是编程的美。
2,微服务
微服务:架构风格一个应用是一组小型服务:可以通过hTTP的方式进行互通单体应用:每一个功能元素最后都是可以独立升级替换的服务单元
3,环境约束
jdk 推荐1.7及以上maven 推荐3.3及以上Intellij IDEA stsspring Boot1.5.9
4,SpringBoot helloworld
1,创建一个maven工程2,导入springboot相关依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 3,编写一个主程序import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class HelloWorldApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class,args); }}
5,springboot 探究hello world
1,父项目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> 他的父项目 。。。。。
导入依赖有默认版本不需要导入版本号
没有在dependencies里面管理的需要导入版本号
2,导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
spring-boot-starter:springboot的场景启动器,导入了web的依赖版本模块
springboot将所有的功能场景都抽取出来,做成一个starter启动器,使用时导入相关场景启动器。
3,主程序类,入口类
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class HelloWorldApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.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 {
@SpringBootApplication注解的配置类
标注在某个类上表示这是一个springboot配置类
@Configuration:配置类上来标注这个注解;
配置类--配置文件;配置类也是容器中的额一个组件;@Component
@EnableAutoConfiguration 开启自动配置功能
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration {
@AutoConfigurationPackage 自动配置包
@Import({Registrar.class})spring的底层导入注解@import给容器中导入一个组件:导入的组件Registrar.class将主配置类(@SpringBootApplication标注的类)的包以及下面所有子包扫描进配置类
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({Registrar.class})public @interface AutoConfigurationPackage {}
@Import({AutoConfigurationImportSelector.class})
给容器中导入组件,导入的就是后面的类的组件
导入的组件以全路径类名的方式返回,这些组件就会被添加到容器中
会给容器导入非常多层次的自动配置类:XXXAutoConfiguration就是给容器中导入自动配置的组

6,SpringInitializer快速创建springboot项目



默认生成的springboot项目
主程序已经生成好了,我们只需要我们自己的逻辑
resource文件夹的目录架构
static保存静态资源:js/css/image
templates:保存所有的模板页面 :(spring Boot默认jar包使用嵌入式的tomcat)可以使用模板引擎
application.properties:springboot应用的配置文件
二、配置文件
1、配置文件
springboot使用的是一个全局的我配置文件,配置文件名是固定的
application.properties
application.yml
配置文件的作用,就是修改springboot的默认值
yaml(yaml ain`t Markup language)
标记语言
以前的配置文件都是XXX.xml
properties:
server.port=8080;
yml
server: • port: 8081
xml
<server> <port>8082</port></server>
2、yml语法
1,基本语法
K: V表示一对键值对(空格必须要)
以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是一个层级的
server: • port: 8081 path:/hello
2,值的写法
字面量:普通的值(数字,字符串,布尔)
k:v字面直接来写字符串不用加引号
"":双引号 不会转义特殊字符\n--->换行
'':单引号 会转义特殊字符 \n--->\n
对象 Map(属性和值)(键值对)
k:v 对象还是这种方式
friend:• lastName: zhangsan• age: 20
行内写法
friend: {lastName: zhangsan,age: 20}
数组(list,set)
用-短横线表示数组中的一个元素
pets:-cat-dog
行内写法
pets: [cat,dog]
3,@value获取值和@ConfigurationProperties获取值比较
| @CONFIGURATIONPROPERTIES | @VALUE | |
|---|---|---|
| 功能 | 批量注入 | 单个注入 |
| 松散语法 | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties都能获取到值
如果说,我们只是在配置文件中获取某个值使用@Value来何配置文件
如果说,我们专门编写一个JavaBean,我们就直接使用@ConfigurationProperties
/** 将配置文件的值映射到配置文件中(* @ConfigurationProperties 把配文件的值和Person的属性进行绑定* */@Component@ConfigurationProperties(prefix = "person")public class Person { // @Value("${person.last-name}") private String lastName;
@PropertySource加载制定配置文件&@ImportSource
@PropertySource
@PropertySource(value = {"classpath:application.properties"})@Component@ConfigurationProperties(prefix = "person")
@ImportSource导入spring配置文件 让里面的内容生效
Spring Boot里面没有spring的配置文件,我们自己写的也没办法生效
@ImportResource(locations = {"classpath:beans.xml"})
Spring Boot推荐添加组件方式
推荐使用全注解的方式
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd> <bean id="helloService" class="com.xja.hellodemo2.demo.service.HelloService"></bean></beans>
1配置类====spring配置文件
/** @Configuration当前类是个配置类* <bean>添加* */@Configurationpublic class MyAppConfig {//将方法的返回值添加到容器中,容器中这个组件默认id就是方法名 @Bean public HelloService helloService(){ System.out.println("成了"); return new HelloService(); }}
4、配置文件占位符
1、随机数
person.last-name= zhangsan${random.uuid};
person.age=${random.int}
//随机数
2、占位符获取之前配置的值,如果没有:默认值
person.dog.name=${person.hello:hello}_dog
//默认值