详细SpringBoot框架教程——SpringBoot开发实践

本篇文章主要内容
SpringBoot开发最佳实践
SpringBoot敏感配置信息加密
SpringBoot数据库连接池
SpringBoot跨域资源共享CORS
SpringBoot静态资源处理
SpringBoot核心配置文件
(Duration/DataSize单位类型、随机值、占位符、多环境、4种配置文件读取方式)
SpringBoot线程池异步调用(@Async、手动编码)
SpringBoot开发最佳实践
1、SpringBoot 程序,每个类应该有一个包,没有包的话会出现问题;
2、一个合理的包结构:

3、我们通常建议您将主应用程序类放在其他类之上的根包中,主类上需要有一个@SpringBootApplication注解,默认是扫描当前包及子类下的标有@Component, @Service, @Repository, @Controller等注解的bean;
4、如果main类上不使用@SpringBootApplication注解,可以使用@EnableAutoConfiguration、@ComponentScan、@Configuration 注解代替;
5、main方法的类也是一个配置类,也是ioc容器中的一个bean,Springboot不推荐使用xml配置方式;
6、还可以通过@Import导入其他bean对象(组件),或者通过@Configuration加入bean组件,或者@Configuration+@Bean,或者@Configuration+@ComponentScan加入bean对象(组件);
7、也可以通过@ImportResource(locations = "classpath:applicationContext.xml")加入xml配置的bean对象(组件);
8、禁止某些自动配置:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
或者在配置文件中 spring.autoconfigure.exclude= 进行排除,可以达到优化程序的效果;
9、springboot内嵌了web服务器,所以打成一个jar包即可运行,方便我们的开发和调试;
10、延迟初始化bean:spring.main.lazy-initialization=true

如果要禁用某些bean的延迟初始化,则可以使用@Lazy(value=false)注解将它们的延迟属性显式设置为false;
SpringApplication启用延迟初始化后,将根据需要创建bean,而不是在应用程序启动期间创建bean,因此启用延迟初始化可以减少启动应用程序所需的时间。在Web应用程序中,启用延迟初始化将导致许多与Web相关的Bean直到收到HTTP请求后才被初始化。延迟初始化的缺点是,它可能会延迟发现应用程序的问题。如果错误地配置了Bean的延迟初始化,则可能导致启动时没有问题,在访问调用的时候出现问题,另外还必须注意确保JVM有足够的内存来容纳所有应用程序的bean,而不仅仅是启动过程中初始化的bean,由于这些原因,默认情况下SpringBoot不会开启延迟初始化;
11、CommandLineRunner, ApplicationRunner在springboot启动后回调着两个接口里面的run方法;
SpringBoot敏感配置信息加密
配置信息加密主要利用了http://www.jasypt.org/ 这个类库,Jasypt是一个Java库,允许开发人员以最小的努力将基本的加解密功能添加到你的项目中,而无需对密码加解密的工作原理有深入的了解;
Github:https://github.com/jasypt/jasypt 这个库是java语言写的;
不过直接使用上面这个类库进行开发稍微有些麻烦,所以在SpringBoot中有人对Jasypt制作了一个starter依赖,方便开发,maven依赖如下:

加解密代码

SpringBoot中的数据源
SpringBoot默认采用的是HikariCP数据库连接池,该数据库连接池性能极好;
若要更换为阿里巴巴Druid数据库连接池,首先把HikariCP的依赖排除掉:

然后添加druid依赖

然后需要在配置文件中指定:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
另外一种更简洁的方式是通过starter更换为Druid数据库连接池,直接加一个依赖即可:

除此之外还有其他一些数据库连接池:
DBCP
DBCP2
Tomcat JDBC
C3P0
等等
SpringBoot跨域资源共享CORS支持
Spring 4.2.x版本开始支持CORS
我们知道,传统的Ajax请求只能获取在同一个域名下的资源,但是HTML5规范中打破了这种限制,允许Ajax发起跨域的请求;
浏览器本身是可以发起跨域请求的,比如你可以链接一个外域的图片或者脚本,但是javascript脚本是不能获取这些外域资源内容的;
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing),它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制;
这种CORS使用了一个额外的HTTP响应头来赋予当前user-agent(浏览器)获得非同源资源的权限,这里的非同源就是Cross-Origin的概念,这里的权限就是访问非同源的资源权限;
CORS是现在HTML5标准中的一部分,在大部分现代浏览器中都有所支持,可能在某些老版本的浏览器不支持CORS,如果要兼容一些老的浏览器版本,则需要采用JSONP进行跨域请求;
同源与非同源的定义
如果访问协议、端口(如果指定了端口)、host都相同,则称之为同源,否则为非同源;
比如源链接: http://store.company.com/dir/page.html

SpringBoot解决跨域问题,只需要配置如下代码即可:

JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写;
JSONP实现跨域请求的原理简单来说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据;
JSONP 由两部分组成:回调函数和数据,回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指定的,而数据就是传入回调函数中的 JSON 数据,例如;

CORS与JSONP比较
CORS与JSONP都是为了跨域,但是CORS比JSONP更强大;
JSONP只支持GET请求,CORS支持所有类型的HTTP请求;
JSONP的优势在于支持老式浏览器;
SpringBoot静态资源处理
静态资源:js, css, html, 图片,音视频等;
静态资源路径:是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接访问;
Spring Boot默认静态资源目录位置位于classpath下,目录名需符合如下规则:
有4个目录下的静态资源可以直接访问:
/static
/public
/resources
/META-INF/resources
在SpringBoot的源码中有定义:

可以通过spring.resources.static-locations=classpath:/mysource/进行修改;
SpringBoot核心配置文件
1、.properties文件
键值对的properties属性文件配置方式
SpringBoot默认读取该文件作为项目配置文件
2、.yml文件
yml 也是一种配置文件格式,主要采用空格、换行、冒号等格式排版进行配置;
yml 后缀也可以使用 yaml 后缀;
配置的值与前面的冒号必须要有一个空格;
只要在类路径上具有SnakeYAML的jar包,SpringApplication类就会自动支持YAML作为配置文件,默认的spring-boot-starter自动依赖了SnakeYAML;
具体使用可以参考一下视频演示;
3、多环境配置文件
#比如配置测试环境
spring.profiles.active=dev
application-dev.properties
#比如配置生产环境
spring.profiles.active=product
application-product.properties
配置随机值,通过配置文件得到一个随机值,springboot提供RandomValuePropertySource可用于注入随机值(例如,注入一些随机值或测试用例),它可以产生整数,longs,uuid或字符串,如下示例所示:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
4、配置文件中可以使用占位符:
my.name = cat
my.desc = ${my.name} is a teacher.
5、Duration单位转换:
30秒超时:
30,PT30S、30s都是等效的;
500ms超时:
500,PT0.5S和500ms都是等效的;
也可以使用任何受支持的单位,包括:
ns纳秒
us 微秒
ms 毫秒(毫秒)
s秒
m分钟
H 小时
d天
w周
m月
y年
比如:
server.servlet.session.timeout=1800s
server.servlet.session.timeout=30m
server.servlet.session.timeout=PT30m
6、DataSize 类型单位转换
若要指定10 MB的缓冲区大小,则10和10MB是等效的;
256个字节的大小阈值可以指定为256或256B;
B for bytes
KB for kilobytes
MB for megabytes
GB for gigabytes
TB for terabytes
比如:
server.tomcat.max-swallow-size=2048KB
application.properties/yml文件读取
1、通过@Value注解读取;(配置项比较少的时候)
2、通过映射类读取;(配置项目比较多的时候)
新建一个配置映射类,只需要说明配置的前缀
@ConfigurationProperties(prefix = "myconfig.user")//前缀
public class User {
private String name;//自动匹配name
private int sex;//自动匹配sex
private int age;//自动匹配age
}
3、通过Environment对象读取;(spring ioc直接就给我们创建了该环境对象)
从环境对象中读取配置;
@Autowired
Environment env;
@GetMapping("/user")
Public String user() {
StringBuilder sb = new StringBuilder();
sb.append("从Environment中获取配置:\n");
sb.append(env.getProperty("myconfig.user.name"));//注意这里不加${}
return sb.toString();
}
4、通过嵌套静态内部类读取(参考server.前缀的方式)
SpringBoot线程池异步调用
SpringBoot框架自动装配提供了一个的线程池,用于提交异步任务;
有了线程池我们就只需要写任务即可,提交任务采用@Async注解;(底层是aop)
Springboot自动装配提供的线程池还可以根据需要进行配置:
#SpringBoot配置线程池,修改线程池默认配置
spring.task.execution.pool.max-size=99999
spring.task.execution.thread-name-prefix=cat-task-
spring.task.execution.pool.queue-capacity=99999
我们也可以覆盖SpringBoot自动配置的线程池,用我们自定义的线程池:
如果想更深入的学习springboot,奉上springboot全套视频教程,视频学习效果更佳,走过路过别忘素质三连哦~~

