目录
spring boot的核心功能
spring boot环境搭建
定义引导类
修改spring boot启动注释
spring boot热部署
使用idea快速创建spring boot项目
分析起步依赖
分析自动配置
spring boot配置文件的类型
读取配置文件
Environment获取配置数据
EnableConfigurationproperties(类方式属性)
configuration-processor(配置提示)
spring boot扫描包注解
profile切换spring boot环境
spring boot访问静态资源
spring boot 异步处理(多线程)
spring boot的缓存
spring自定义starter
spring boot和maven的部署问题解决
前言
利用spring boot来管理依赖,通过内置的服务器直接运行项目
spring boot 还提供了自动配置,那么复杂的配置可以一步到位
sprig boot 基础(2) https://blog.csdn.net/yzj17025693/article/details/90601997
spring boot其它详细配置 https://www.cnblogs.com/chen-lhx/p/7592523.html
导入起步依赖,这个parent工厂里有很多的jar被管理了,子工厂直接引入即可
导入web功能起步依赖
spring-boot-starter-web起步依赖,就是导入spring和spring mvc的jar包
定义一个引导类,需要在类上加上@SpringBootApplication
run方法是执行引导类,传入引导类的字节码
看输出信息
我们知道spring boot有一个内置的服务器,随着引导类的启动而启动
输入localhost:8080 可以直接访问,但是我们没有任何的功能
编写controller,直接返回一个字符串,加上Response代表返回json,也就是返回一个字符串到页面
直接访问请求
我们发现我们没有导入spring mvc的包,也没有配置注解扫描,也可以使用注解
因为我们导入了 web功能起步依赖
并且转换到页面的时候,也不会乱码,默认sprig boot已经给你配置了消息转换器
spring boot启动后会出现这些输出banner(横幅),这个其实是可以替换的,当作娱乐了
有专门的网站可以制作这种文字
把上面的文本复制到一个记事本里,命名为banner,然后启动即可
一些静态的页面和数值在热部署的情况下,不需要重启服务器或者引导类
https://www.cnblogs.com/yjmyzz/p/use-devtools-of-spring-boot-framework.html
不过编译太过于频繁也不好,我习惯于关掉
生成的目录可以进行简化,mvnw.cmd可以定义一些常用的maven命令
进入parent
发现它会加载3个配置文件
但是又会排除这3个配置文件,所以这3个配置文件不是必须的
start-parent又依赖父工程一个boot-dependencise
里面会依赖很多包
我们之前使用spring mvc的时候并没有配置相关的xml,是因为spring boot给我们自动配置了
从这句引导类的注解开始分析
如果不想某个功能自动配置,希望手动配置,比如solr,可以在注解上加上exclude
而这个后面的类可以在spring-boot-autoconfigure找到
@interface是定义一个注解,这个注解的名称是就是一个类,这里牵扯到注解的编写,不过多的概述
EnableAutoConfiguration就是自动配置
import的意思是在当前注解下引入其它的配置(AutoConfigLocationImportSelector导入选择器)
Candidate(候选) 箭头所指是获取候选的配置,也就是可选择的配置
通过加载工厂名获取配置集合
这个配置在META-INF下,不过是源码里的META-INF
打开源码,打开spring.factories
分析一个具有代表性的
@Bean注解等价于配置文件中的
一般都是返回一个对象
上面EnableAutoConfigurationProperties就是自动开启配置,点开serverProperties
还有一个prefix前缀,修改的时候需要加上这个前缀才能找到
在源码的json里已经给你配置了,在某些地方会加载json数据,并且给上面属性赋值,这里就不深究了
而这3个配置文件就是可以用来覆盖之前配置的数值
创建同名文件在资源目录下,会被自动扫描,这时候启动的时候就变成了8081
上面我们知道想要修改默认的配置文件,可以通过3种配置文件,properties,yml,yaml
对象数据和map数据一样的
yml修改tomcat启动端口
优先加载yml,最后加载properties,后面的会覆盖前面的
使用@Value把配置文件里的数据映射到java中
这个name是单一数据,如果是对象里的name,那么需要 对象.name
安全映射
当加上了prefix指定了配置文件里的对象前缀后,那么就不需要加@Value
不过,这些属性就需要加上set方法.比如依然获取不到值
我们的属性注入还可以通过类来间接注入
使用Configurationproperties和lombok的@Data注解(简化get/set)来定义属性
当然还需要写application配置文件
使用EnableConfigurationproperties来自动配置类,会找到对应的类型注入进去
这个类记得写上@Configuration注解
另一种方式,在方法上加上ConfigurationProperties
会检查返回的类里面有没有,对应的jdbc后面属性的set方法,DataSource这个类里有对应的set方法
IDEA提示找不到configuration-processor(执行器),这是一个警告
右边打开文档
在maven里引入依赖,这时候我们配置yml的时候会有对应的提示,比如对象里有什么属性
@EntityScan 这个扫描实体类,这个是spring boot注解的功能
@ComponentScan 这个是扫描普通类,是spring自带的注解功能,使用了spring注解的都要扫描到
只写一个springbootapplication的情况下,会扫描启动类包下的所有子包
所以创建项目的时候,一般都会创建在外层创建,这样会自动扫描
但是如果其它的包不在同一个工程目录下,依赖了其它项目后,还需要用上面的注解来添加指定的包
profile介绍 https://blog.csdn.net/yzj17025693/article/details/90549167
prod是生产环境,dev是开发环境,sit是测试环境,这些是我们自己定义的而已,不是固定的
只需要创建对应的配置文件
然后在application.properties下使用spring.profiles.active=xxx 这个xxx就是application- 后面的名称
多个路径用逗号隔开即可
只要放到classpath下的public和static目录下的静态资源,直接可以访问,访问的时候不需要写目录
因为resources下的文件编译后就会放到classpath根目录
当然也可以设置spring-resources-static-locations=xxx 但是如果设置了,默认的就失效了
之前实现多线程,是需要用我们的类继承Thread或者使用Runable创建线程
现在只需要在方法上定义@Async,那么这就是一个线程安全的方法,自动加锁了的
AsyncResult是spring的类,终究父类还是Future
Future类的理解(这里不做过多的理解)
也就是说,可以拿到线程的状态
这样在下面就可以来判断线程的状态
还需要在启动类开启异步调用
参考 https://my.oschina.net/u/3452433/blog/1831026
启动类开启注解
如何编写自动配置
需要做一个启动器,这个启动器只是用来引入相关的jar的,我们的主项目中就是引入这个
然后autoconfigurer就是自动配置的jar
需要在autoconfigurer先引入
需要get/set方法
写一个配置类,这个prefix前缀是在application.yml里的前缀
使用了enableconfigurationproperties,后面指定类,然后在类里注入
利用@Bean注解,返回serivce对象,并且把properties注入进去
在resources的META-INF下创建spring.factories
在主项目里,引入依赖,首先要把上面的项目给安装到maven里
引入了依赖后可以直接注入HelloService
然后在配置文件里指定前缀和后缀,输入的时候就会在 haha 的前后加上
参考 https://blog.csdn.net/hotdust/article/details/51404828
参考 https://www.cnblogs.com/thinking-better/p/7827368.html
参考 https://www.cnblogs.com/liaojie970/p/9007577.html
spring boot和maven的插件,简化了部署了,之前是使用maven-tomcat插件,现在是spring boot和maven的插件,进行了2次打包后
能够让jar直接运行,但是这时候如果编译maven就会出问题
在拆分项目之后,所有工程继承于父工程
当pom文件不是继承自spring-boot-starter-parent,这时候可以排除repackage,不然编译会报错
当pom文件继承自spring-boot-starter-parent,可以试试在子工程的pom.xml下指定启动类
注意,包含了spring boot启动类的项目可以不用加这个,因为直接启动就编译了