SpringBoot系列
SpringBoot系列
用了这么长时间的SpringBoot了,最近想写几篇博客记录一下自己的心得。希望能对正在学SpringBoot的博友们,能有些许的帮助。
什么是SpringBoot?
通俗的来讲,SpringBoot可以说成是Spring的升级版,以更少的配置完成了Spring的功能。它的优势如下:
- 简化编码
- 简化配置
- 简化部署
- 简化监控
SpringBoot代码结构
根据官方文档来说,SpringBoot中不推荐使用default包,也就是不推荐使用默认包,因为它可能会导致@ComponentScan、@EntityScan、@SpringApplication等注解出现一些问题。
@SpringApplication注解应该始终应用在main方法的主类上,并且该类应该放在与controller、dao、service等包同级。据官方提示,@SpringApplication可以实现对同级、同级子包(递归)的注 解和配置扫描,等价于@EnableAutoConfiguration、@Configuration 和@ComponentScan 三个注解。
自动配置
SpringBoot 能简化配置,很大原因是遵循“约定大于配置”的思想。列如,你的项目中依赖了某一个jar包,SpringBoot会"猜测"你应该是要在项目中使用这个jar中的类,因此会自动帮你配置这个jar中的bean。你只需要在启动类上添加@EnableAutoConfiguration注解,表示你希望SpringBoot开启自动配置功能。
@EnableAutoConfiguration注解
刚才有讲到过,@EnableAutoConfiguration注解是表示你希望SpringBoot开启自动配置功能。那我们自己写的jar文件如何加入这个注解呢?打开 SpringBoot 自动配置的 jar 包中 spring.factories 文件可以看到默认支持 自动配置的框架、类库等,如下:
使用了@EnableAutoConfiguration 注解后,等于打开了 SpringBoot“按依赖的 jar 帮你自 动配置 Bean”的开关。如果自己开发的 jar 需要自动配置,只需在你的项目的 META-INF 目 录也提供一个 spring.factories 文件,参考官方配置即可。
第一个SpringBoot
在此过程中,我们使用IDEA来完成第一个SpringBoot项目。
1.打开IDEA,创建一个新项目,这里我们选择Spring Initializr,SpringBoot要求JDK在1.8以上,所以我们选择JDK1.8。Choose Initializer Service URL 选择 Default:http://start.spring.io。创建好之后就下一步
2.在下图填写相关的项目信息
点击 Next 后,出现下图所示的界面。
然后再设置一下存放目录,与项目名称,点击Finish,就完成了SpringBoot的创建
3.项目创建完成后会自动生成很多文件,其中有一个…Application的文件是用于启动SpringBoot项目的,其中有一个main方法,我们指导main方法是程序的入口,我们可以右键Run '…Application’来运行程序。
main方法所在路径:com/text/springboot/…Application
Pom.xml中的依赖介绍
我们打开pom.xml文件,找到parent节点,SpringBoot项目默认继承了spring-boot-starter-parent项目,按住 Ctrl 键,点击进去,然后可以看到继承了 spring-boot-dependencies,再按住 Ctrl 键,点击进入,这时找 properties 与 dependencies 节 点,可以看到很多我们熟悉的框架 jar 包。
另外,pom.xml文件中还有三个默认模块:
- spring-boot-starter-web:Spring Boot Web 项目的核心模块;
- spring-boot-starter-thymeleaf:SpringBoot 的视图模块,让 SpringBoot 支持 html 视图。 注意:SpringBoot 项目默认不支持 jsp,只支持 html。
- spring-boot-starter-test:测试模块,包括 JUnit、Hamcrest、Mockito。
Spring Boot 自动配置原理是什么?
使用@SpringBootApplication 注解标注主配置类,最主要的功能就是 SpringBoot 开启了 一个@EnableAutoConfiguration 注解的自动配置功能。
@EnableAutoConfiguration下两个重要注解:@AutoConfigurationPackage、@Import
@SpringBootApplication
使用@SpringBootApplication标注的类是SpringBoot项目的主配置类(主程序类)。用于启动SpringBoot项目。我们可以查看它的源码,在其中可以看到两个注解,分别是@SpringBootConfiguration、@EnableAutoConfiguration。
@SpringBootConfiguration注解
我们再进入@SpringBootConfiguration,里面包含@Configuration注解,使用@Configuration注解的类就是一个配置类,它具有 xml 配置文件 的所有功能,用它来代替 xml 配置文件,并且会把这个配置类纳入到 Spring 容器中.
@EnableAutoConfiguration注解
像以前的方式,使用Spring的时候,我们需要去编写很多的配置文件,而SpringBoot却没让我们编写过任何的配置文件,原因就在于这个@EnableAutoConfiguration注解。
@EnableAutoConfiguration注解使得 SpringBoot 可以实现自动配置(原则是约定优于配 置),那具体是如何让 SpringBoot 实现自动配置的呢?我们可以查看它的源码
我们会发现@EnableAutoConfiguration 注解中又包含一大堆的其他注解,其中有两个比 较重要的注解,分别是@AutoConfigurationPackage、@Import。
@AutoConfigurationPackage实现了自动扫描。
@Import则是将所有第三方依赖采用自动配置的方式导入进项目当中。
配置文件格式及使用
SpringBoot提供了两种默认认的全局配置文件分别是:application.properties 和 application.yml,两种格式的配置效果相同,风格各异,按个人喜好二选一即可。下面主要 以 properties 格式的配置为例。
application.properties
普通配置。application.properties 文件中数据的存储格式为 key-value。如 server.port=8011,这里的 key 为 server.port,value 为 8011。
常用系统配置属性
Server常用的配置(Tomcat的相关信息)
server.port 服务器端口
server.servlet.context-path 应用上下文路径
server.tomcat.uri-encoding=UTF-8 读取属性配置文件,项目文件编码成功设置,页面还乱码时候设置
DataSource 常用的配置
spring.datasource.username ----数据库的登录用户名。
spring.datasource.password —数据库的登录密码。
spring.datasource.url ----数据库的 JDBC URL。
spring.datasource.driver-class-name ----JDBC 驱动的全限定类名。默认根据 URL 自动检测。
spring.datasource.name —数据源的名称。
spring.datasource.pool-name ----连接池名称。
spring.datasource.max-active ----连接池中的最大活跃连接数。
spring.datasource.connection-timeout ----连接超时(单位毫秒)
spring.datasource.max-idle -----连接池中的最大空闲连接数。
Tomcat 常用的配置
server.tomcat.accesslog.directory ----创建日志文件的目
server.tomcat.accesslog.enabled ---------是否开启访问日志(默认:false) server.tomcat.accesslog.pattern ---------访问日志的格式(默认 common) server.tomcat.accesslog.prefix ---------日志名前缀(默认:access_log)
server.tomcat.accesslog.suffix ---------日志名后缀(默认:.log)
server.tomcat.max-http-header-sizeHttp ---------消息头最大字节数(默认:0)
server.tomcat.uri-encoding ---------用来解码 URI 的字符编码
Redis 常用的配置
spring.redis.database ----连接工厂使用的数据库索引。(默认值: 0 。) spring.redis.host ----Redis 服务器主机地址。(默认值: localhost 。)
spring.redis.password ----Redis 服务器的登录密码。
spring.redis.port ----Redis 服务器端口。(默认值: 6379 。)
spring.redis.timeout ----连接超时时间,单位为秒。(默认值: 0 。) spring.redis.pool.max-active —连接池在指定时间里能分配的最大连接数。负数表示无限制。默认值: 8
spring.redis.pool.max-idle —连接池里的最大空闲连接数。负数表示空闲连接数可以是无限大。默认值:8
自定义配置属性
自定义属性配置
在application.properties文件中添加我们自定义的属性:
spring.greet=hi.hello
然后在你需要赋值的属性上添加一个@Value注解,注解里是占位符引用属性文件中属性
@Value("${spring.greet}")
private String greet;
这样,我们就能拿到配置文件中的值
配置变量的引用
在application.properties文件中添加自定义属性配置,在当前配置文件中的其他地址引用。
如在application.properties文件中添加如下代码。
spring.msg=hi.hello
spring.greet=kublic博客问候大家:${spring.msg}
随机值变量
在properties文件中也可以给随机值
spring.number=${random.int}
spring.msg=hi.hello
spring.greet=kublic博客问候大家:${spring.msg},${random.int}
@PropertySource 注解
@PropertySource注解的存在就是为了你的数据不在application.properties配置文件中,而是在另一个properties配置文件中,那么在这种情况下,SpringBoot是无法读取这个配置文件中的值的,这个时候,我们就需要这个注解去声明一下:
@PropertySource("classpath:xxxx.properties")
还有另一种的配置文件是yml,不过yml书写规范比较严格,但是功能和properties都几乎差不多,如果有博友比较喜欢yml风格,可以自行百度,这里只演示properties配置文件