Spring Boot来简化Spring应用,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用
背景:
J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的部署流程,第三方技术集成难度大
解决:
"Spring全家桶"时代
Spring Boot—>J2EE一站式解决方案
Spring Cloud—>分布式整体解决方案
优点:
缺点: 入门容易精通难(要想精通,必须精通其源码,API)
2014,Martin Fowler
微服务:架构风格
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
单体应用:ALL IN ONE
每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
环境因数:
–jdk1.8:
–maven3.x
–IntellijIDEA
–SpringBoot 1.5.9.RELEASE
返回目录
完成一个功能
浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串
pom文件里配置:
<parent>
<artifactId>spring-boot-starter-parentartifactId>
<groupId>org.springframework.bootgroupId>
<version>1.5.9.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
@SpringBootApplication//来标注一个主程序类,说明这是一个SpringBoot应用
public class HelloWorldMainApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "Hello World!";
}
}
注意点在包的位置一定要对:
其他类与启动类在同一个包下或者同一级包的下面(后面有解释原因!!!)
pom文件里配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
将这个应用打成jar包(Maven的package命令),直接使用java -jar的命令进行执行
成功!
再用浏览器访问一下地址吧
没问题!
返回目录
父项目:
<parent>
<artifactId>spring-boot-starter-parentartifactId>
<groupId>org.springframework.bootgroupId>
<version>1.5.9.RELEASEversion>
parent>
spring-boot-starter-parent它的父项目是
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>1.5.9.RELEASEversion>
<relativePath>../../spring-boot-dependenciesrelativePath>
parent>
它才是来真正管理Spring Boot应用里面的所有依赖版本;
它被称为SpringBoot的版本仲裁中心
所有以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
spring-boot-starter-web
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
主程序类,主入口类
@SpringBootApplication//来标注一个主程序类,说明这是一个SpringBoot应用
public class HelloWorldMainApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@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: 配置类上来标注这个注解
配置类————配置文件;配置类也是容器中的一个组件:@Component
@EnableAutoConfiguration: 开启自动配置功能
以前我们需要配置的东西,SpringBoot帮我们自动配置;这个注解会告诉SpringBoot开启自动配置功能;这样自动配置才能生效;
@AutoConfigurationPackage
@Import({
EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage: 自动配置包
@Import({Registrar.class})
Spring的底层注解@Import,给容器中导入一个组件;导入的组件由({Registrar.class}决定
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
@Import({EnableAutoConfigurationImportSelector.class}):给容器中导入组件
EnableAutoConfigurationImportSelector.class:导入哪些组件的选择器;
将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给导入这个场景需要的所有组件,并配置好这些组件;
有了自动配置类,就免去了我们手动编写配置注入功能等的工作;
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
==SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了,帮我们进行自动配置工作;==以前我们需要自己配置的东西,自动配置类都帮我们做了;
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;
返回目录
IDEA使用Spring Initializer快速创建SpringBoot项目
步骤:
启动并测试:(成功!!!)
IDE都支持使用Spring的项目创建向导快速创建一个SpringBoot项目;
选择我们需要的模板;向导会联网创建SpringBoot项目;
默认生成的SpringBoot项目:
SpringBoot使用一个全局的配置文件(配置文件名是固定的)
配置文件放在src/main/resources目录或者类路径/config下
配置文件的作用:修改SpringBoot自动配置的默认值;
原因在于SpringBoot在底层都给我们自动的配置好了;要想修改默认配置,只能使用这些全局配置文件。
.yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
.yml全称有两种写法合并:
标记语言:
以前的配置文件;大多都使用 xxx.xml
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
server:
port: 8081
xml配置:(大量的数据都浪费在标签的开闭上)
<server>
<port>8081port>
server>
基本语法:
server:
port: 8081
path: /hello
属性和值也是大小写敏感;
值的写法:
friends:
lastName: zhangsan
age: 20
行内写法:
展示效果一:
friends: {
lastName: zhangsan,
age: 18
}
展示效果二:
friends: {
lastName: zhangsan,age: 18}
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
以上皆可嵌套!!!
实例:
配置文件值注入
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
person:
lastName: c
age: 18
boss: true
birth: 2021/6/6
maps: {
k1: v1,k2: v2}
lists:
- 张三
- 李四
dog:
name: 狗哥
age: 2
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* /@ConfigurationProperties :告诉SpringBoot将本类中所有属性和配置文件相关的配置进行绑定;
* prefix = "person":表示指定配置文件中哪个名字下面的所有属性进行一一映射(这里是person下面)
* /@Component :标明只有这个组件是容器的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//生成的getter和setter方法还有toString方法的重写略
}
public class Dog {
private String name;
private Integer age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@SpringBootTest//SpringBoot单元测试
class SpringBoot01HelloworldQuickApplicationTests {
@Autowired//自动注入
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
结果:
再展示一下properties编写person类信息
#properties编写person类信息
person.last-name=张三
person.age=18
person.birth=2021/6/6
person.boss=true
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=2
其他不变,运行即可
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 可以批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;