SpringBoot
1:Spring Boot简介
简化Spring应用开发的一个框架。
整个Spring技术栈的一个大整合。
JavaEE开发的一站式解决方案。
2:微服务
2014,martin fowler
微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过Http的方式进行互通。
每一个功能元素最终都是一个可独立替换和独立升级的软件单元。
3:YAML语法
一,基本语法
K:V:表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
server
属性和值大小写敏感的。
二,值的写法
● 字面量:普通的值(数字,字符串,布尔)
k:v:字面直接来写;
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思。
name:"zhangsan \n lisi":输出:zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据。
name:"zhangsan \n lisi":输出:zhangsan \n lisi
● 对象:Map(属性和值)(键值对)
k:v:在下一行来写对象的属性和值的关系;注意缩进
friends:
lastname:zhangsan
age:20
行内写法:
friends:
● 数组:(List,Set)
用 - 值表示数组中的一个元素
pets
行内写法:
pets:
三,配置文件值注入
配置文件:
persen
javaBean:
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定
* (prefix = "persen"):配置文件中那个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器提供的功能@ConfigurationProperties
*/
我们可以导入配置文件处理器,以后编写配置就有提示了:
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
1:@value获取值和@ConfigurationProperties获取值比较:
@ConfigurationProperties | @value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEl | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml和properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
2:@PropertySource和@ImportResource:
@PropertySource:加载指定的配置文件。
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效。
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别。
想让Spring的配置文件有效,加载进来;把他@ImportResource标致在配置类上。
Spring Boot推荐给容器添加组件的方式:推荐使用全注解的方式;
● 使用@Bean给容器中添加组件:
/**
* @Configuration:指明当前类是一个配置类,就是来替代之前的Spring配置文件。
* 在配置文件中用<bean></bean>标签添加组件
*/
4:整合SpringData JPA(java持久层API)
1),编写一个实体类(bean)和数据表进行映射,并且配置好映射关系。
/**
* 使用JPA注解配置映射关系
*/
2),编写一个Dao接口来操作实体类对应的数据表(Repository);
//继承JpaRepository来完成对数据库的操作
public interface RepositoryDao extends JpaRepository<User, Integer> {
}
3),基本的配置;
spring
Hibernate:
1),是一个全自动的ORM,与数据库无关,面向对象的。SpringDateJPA --->封装了Hibernate --->JDKAPI
hibernate 对象有三个状态:
1,瞬时状态 ---> 刚创建出来的Hibernate无任何关联与数据库无任何关联。
2,持久化状态 ---> 被hibernate管理,并且session没有关闭,内存中存在数据库中也存在,如果内存中的数据发送变化会去同步数据库的数据。
3,游离状态 ---> session关闭了,数据库中可能存在。
ORM关系对象映射中:
1),OneToOne。
2),OneToMany(默认使用懒加载)。
3),ManyToOne(默认使用急加载)。
4),ManyToMany(两个oneTomany)。
5:Spring-boot启动流程;
几个重要的事件回调机制:
配置在META-INF/spring.factories
ApplicationContextInitializer
ApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
CommandLineRunner
1),创建SpringApplication对象。
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return new SpringApplication(sources).run(args);
}
//调用此方法创建SpringApplication对象
public SpringApplication(Object... sources) {
initialize(sources);
}
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
//保存主配置类
this.sources.addAll(Arrays.asList(sources));
}
//判断当前是否是web应用
this.webEnvironment = deduceWebEnvironment();
//从类路径下找到META-INF/Spring.factories配置的所有ApplicationContextInitializer;然后保存起来;
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInit.class));
//从类路径下找到META-INF/Spring.factories配置的所有ApplicationLtener
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//从多个配置类中找到有main方法的主配置类
this.mainApplicationClass = deduceMainApplicationClass();
}
2),运行run方法。
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
//获取SpringApplicationRunListenners;从类路径下META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//回调所有获取的SpringApplicationRunListenner.starting方法
listeners.starting();
try {
//封装命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//准备环境
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
//创建环境完成后回调SpringApplicationRunListenners.environmentPrepared()表示环境准备完成
Banner printedBanner = printBanner(environment);
//创建ApplicationContext;决定创建web的ioc还是普通的ioc容器。
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
//准备上下文环境;将environment保存在ioc中;而且applyInitializers();
//applyInitializers():回调之前保存的所有ApplicationContextInitializer的initialize()方法
//回调之前保存好的所有SpringApplicationRunListenner的contextPrepared()方法;
//preparedContext运行完成以后回调所有的SpringApplicationRunListenner的contextLoaded()方法;
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//刷新容器,ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat);
refreshContext(context);
//从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调;
//ApplicationRunner先回调
afterRefresh(context, applicationArguments);
//所有的SpringApplicationRunListener回调fineshed()方法;
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//整个Spring-boot启动完成之后返回启动的ioc容器
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);