欢迎光临散文网 会员登陆 & 注册

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

2021-03-30 11:32 作者:动力节点小王本王  | 我要投稿



本篇文章主要内容

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全套视频教程,视频学习效果更佳,走过路过别忘素质三连哦~~

详细SpringBoot框架教程——SpringBoot开发实践的评论 (共 条)

分享到微博请遵守国家法律