今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招,用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅,让我们每个人手头负责的代码和工程都要很漂亮~~~
这里的优化小妙招很多不是说直接对springboot来优化,有些是对springboot自己的优雅特性做一些总结,帮助大家更加系统全面的了解springboot开发的时候,如何做可以让我们的代码和系统更加的优雅。
当然,因为要分享的优化小妙招很多,我们更多的是给大家展示一下优化的一些点和思路,具体的使用大家如果要落地,还得自己查阅官网资料!
1. 使用@SpringBootApplication注解简化配置
SpringBoot提倡“约定大于配置”,而@SpringBootApplication注解正是这一理念的体现。它集成了@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解,让你的主类配置瞬间简洁明了。
说实话,一般来说我们都是用springboot来开发系统的时候,都是默认都加@SpringBootApplication注解的,这个倒不能说是优化小妙招,更多的是给大家引入一下这个注解,我们可以学习一下springboot框架这种优雅的设计理念。
也就是说,SpringBoot为了尽最大可能去简化一个web系统的启动,设计了SpringApplication启动类一键启动一个web系统,所有的web server、spring容器、bean管理、三方组件管理、扩展组件管理,其实都是默认行为去管控的,最大简化我们的系统开发,搭配上一些注解的使用,就从头开始就让我们的系统非常优雅!
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. 利用配置文件简化代码
SpringBoot支持多种格式的配置文件,如application.properties和application.yml。你可以将一些配置信息放在这里,减少硬编码,让代码更加灵活。
这个说实话一般人用springboot开发系统也都是加配置文件的,毕竟配置信息不要写死在代码里,把配置信息放外部配置文件,这样才能优雅,而且一般还可以搭配springboot的profile功能把不同环境的配置文件区分开来,部署的时候指定一个环境就可以了。
# application.yml
server:
port: 8080
my:
greeting: Hello, World!
@Value("${my.greeting}")
private String greeting;
3. 使用Actuator监控应用
SpringBoot Actuator提供了很多内置的端点,让你能够监控和管理应用。比如/health端点可以告诉你应用的健康状态,/metrics端点则提供了各种度量信息。
这个其实就是系统上线以后我们是需要对系统进行监控的,那一般小公司没有大公司完善的基础设施,如果我们要快速开发和部署一个系统上线,其实可以直接用springboot自带的监控功能来对线上系统进行基础的监控。
<!-- 在pom.xml中添加Actuator依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4. 异步处理提升性能
SpringBoot支持异步处理,你可以使用@Async注解来异步执行方法,提升应用的性能和响应速度,这个是一个好功能,如果执行异步功能,一般我们都要自己开线程去执行异步任务,但是用异步注解可以由框架启动一个内嵌的异步任务执行我们的代码逻辑,这个相当优雅,有没有?代码是不是很漂亮!
@Service
public class AsyncService {
@Async
public void executeAsyncTask() {
// 执行异步任务
}
}
5. 利用缓存减少数据库访问
SpringBoot支持多种缓存抽象,如ConcurrentMap、EhCache、Redis等。使用缓存可以减少对数据库的访问,提高应用的性能。以前咱们用缓存的时候,那肯定是要自己封装缓存组件的,完了在封装好的缓存组件里基于开源的缓存系统的客户端来实现各类功能,对吧,然后再代码里是不是我们还得自己动手编写缓存读写的代码逻辑?
好,那现在我们可以用@CacheConfig、@Cacheable等注解直接让框架去托管缓存的读写,自动把数据库查询结果进行缓存,以及下次查找的时候自动读取缓存,是不是感觉很方便?就省去了自己写缓存读写代码的过程了,又变得优雅了有没有~~~
@Service
@CacheConfig(cacheNames = "books")
public class BookService {
@Cacheable
public Book findBook(ISBN isbn) {
// 模拟耗时操作
return findBookFromDatabase(isbn);
}
}
6. 使用JPA简化数据库操作
SpringBoot与Spring Data JPA结合,可以让你用非常简洁的代码完成复杂的数据库操作。咱们平时要是封装数据库操作,是不是得自己动手搞?那现在直接用Spring Data JPA来做数据库操作的ORM,是不是感觉方便了很多?
以前我们得自己写sql语句,自己做数据的增删改查,现在都是面向对象编写数据库操作逻辑,框架底层自动托管生成sql语句去做数据库的增删改查,是不是很优雅很方便?
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findByAuthor(String author);
}
7. 优化RESTful API设计
RESTful API的设计应该简洁、直观。使用SpringBoot,你可以很容易地创建RESTful API,并使用Swagger等工具进行文档生成和测试。这个功能实在是太常用了,没用springboot的时候,其实咱们还得自己整合ssm框架,完了去用springmvc开发web接口,现在用了springboot以后,内嵌就帮我们搞定了spring和springmvc的框架整合这些事情,直接上手编写web接口,一键启动启动就可以对外提供http接口了,很方便有没有~~~
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public ResponseEntity<Book> getBook(@PathVariable Long id) {
// 获取书籍并返回
}
}
8. 使用Spring Security保护应用
SpringBoot与Spring Security的结合,可以让你轻松地保护你的应用。你可以配置用户、角色、权限等,还可以使用OAuth2、JWT等高级特性。所谓的安全性保护,说白了就是我们写好的系统发布上线了,不能随便谁都可以来调用接口吧?不能随便谁来提交数据我们都允许修改系统数据库里的数据吧?不能随便谁来查询数据我们都开放给他查询吧?
那是不是得有一套安全防护机制?比如说限制一下哪些http接口路径要进行防护,我们防护的时候是怎么防护,是不是说要求请求方必须携带用户token信息,然后是不是要对请求里带的token信息进行有效校验、权限校验?必须是我们允许的用户携带了有效的校验信息,我们才可以允许他来请求系统,是不是?
那所以这块是不是可以跟spring security框架整合,直接把防护性功能给做了?
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout();
}
}
9. 利用Lombok简化模型类
Lombok是一个Java库,它可以自动插入编辑器并构建工具,简化Java模型类的编写。使用Lombok,你可以省去getter、setter、构造器等方法的编写。这个lombok框架还是很方便的,因为我们有了他,就不用动手写一大堆的冗余方法了,让我们的代码更加简洁明了,domain领域对象可以专注自己的属性就可以了。
@Data
public class Book {
private Long id;
private String title;
private String author;
}
10. 使用MapStruct处理对象映射
MapStruct是一个代码生成器,它基于约定优于配置的原则,可以在Java bean类型之间自动实现映射。使用MapStruct,你可以避免手动编写繁琐的映射代码。这个框架也是相当的有用,我们如果要是在一些VO、DO、DTO等对象之间进行对象转换,不用自己动手封装转换逻辑了,直接用这个框架就可以实现对象转换了,很优雅有么有~~~
@Mapper
public interface BookMapper {
BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);
BookDto toDto(Book entity);
Book toEntity(BookDto dto);
}
11. 使用Spring Boot Admin监控多个应用
Spring Boot Admin是一个开源社区项目,用于管理和监控基于Spring Boot的应用。它可以显示应用的健康状态、度量信息、环境属性等。这个就跟我们上面说的一样,springboot快速开发一个系统然后发布上线,咱们肯定要监控,除了springboot内嵌的监控机制以外,还可以用springboot admin来进行更加完善的监控。
<!-- 在pom.xml中添加Spring Boot Admin Client依赖 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
12. 使用Spring Cloud构建微服务
SpringBoot与Spring Cloud的结合,可以让你轻松地构建微服务架构的应用。Spring Cloud提供了服务发现、配置中心、消息总线、负载均衡等微服务所需的组件。如果我们开发的系统要拆分多个子系统,或者是多个服务,引入多人团队来协作开发,那肯定会引入微服务框架,要不然用springcloud原生技术栈,要不然用springcloud alibaba技术栈,这块都是可以让我们的系统变得更好,对不对?
@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceApplication.class, args);
}
}
13. 使用Spring Boot Test进行集成测试
SpringBoot提供了强大的测试支持,你可以使用@SpringBootTest注解来进行集成测试,还可以使用@MockBean、@SpyBean等注解来模拟依赖。这个其实很有用,因为我们平时写好了代码以后要进行测试,一般就是单元测试、冒烟测试、集成测试、验收测试等,那其实用springboot test框架可以更加方便的帮助我们进行各类代码测试。
@SpringBootTest
public class BookServiceTests {
@Autowired
private BookService bookService;
@Test
public void testFindBook() {
Book book = bookService.findBook("1234567890");
assertNotNull(book);
assertEquals("Spring Boot in Action", book.getTitle());
}
}
14. 使用Docker容器化部署
SpringBoot应用可以很容易地容器化部署,使用Docker可以让你的应用在任何支持Docker的平台上运行。这个容器部署其实是现在非常流行的一种部署方式,说白了就是我们的系统每次部署 一般都要设置各种参数,可能还要携带各种配置,或者相关的一些其他东西,那其实如果每次部署多加一台机器都要在机器里重新进行环境配置等繁琐操作,现在我们可以把这个工程和依赖的其他东西做成一个docker镜像。
然后线上部署的时候再新的机器上直接安装docker环境,基于我们的docker镜像就可以一键部署系统了,是不是?相当的方便!
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
总结
以上就是14个SpringBoot相关的优化小妙招,希望它们能让你的代码不仅跑得快,还写得像首诗一样美。SpringBoot的强大之处不仅仅在于它的简洁和易用,更在于它背后的一套完整的生态体系。掌握这些优化技巧,你将能更加高效地开发SpringBoot应用,享受编码的乐趣。