Spring Boot 中的 @EnableWebMvc

Spring Boot 中的 @EnableWebMvc

@EnableWebMvc 注解并不是像一般理解的那样在 Spring Boot 中使用 Spring MVC 必需要有的配置,而且并不是像字面意思那样启用 Spring MVC 的
功能。

@EnableWebMvc 的作用是引入 DelegatingWebMvcConfiguration 类来支持通过 WebMvcConfigurer 来对 WebMvc 进行配置。但其引入 DelegatingWebMvcConfiguration
的结果是导致 Spring MVC 相关的自动配置功能失效。

阅读更多
Spring Boot 集成 WebSocket

Spring Boot 集成 WebSocket

得益于 Spring Boot 约定大于配置的特性,集成 Websocket 非常简单,只需在依赖中加入对应的 starter 就可完成引入。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

加入 starter 后,websocket 已经完成引入,这时可以使用 @Configuration 类来配置,然后使用 @EnableWebSocketMessageBroker 来启用 WS。

阅读更多
Linux 查看当前挂载的硬盘

Linux 查看当前挂载的硬盘

如果单纯想看什么磁盘挂到了什么目录,什么文件系统

1
mount

如果想看磁盘容量等信息,可以使用 df 命令。

1
df -h
自定义 Validation 注解

自定义 Validation 注解

在 Java 后端的数据校验常用 @NotNull@NotEmpty@Size 等注解进行校验,但标应准的验证注解是很局限的,在一些特殊要求的验证中并不能满足需求。

自定义校验注解

要想实现业务用特定需求的验证只用定义一个注解和对应的校验类既可,下面实现一个非空字符串验证注解。

阅读更多
Shiro 导致 Spring 事务失效

Shiro 导致 Spring 事务失效

前段时间将 Shiro 作为权限模块整合到 Spring 中使用,也发了篇整合相关的文章《Shiro 方法上有权限注解的时候才鉴权》,讲如何实现在有打注解时才校验权限。

在集成后的项目中开发时出现有个 Service 的事务是无效的,@Transactional 注解无任何作用。检查后发现这个 Service 是在 Shiro 的 Realm 类中使用 @Autowired 注入的。

阅读更多
Spring 缓存抽象之基于注解的声明式缓存

Spring 缓存抽象之基于注解的声明式缓存

Spring 提供了一些 Java 注解用于声明缓存。

  1. @Cacheable 用于触发缓存
  2. @CacheEvict 用于失效缓存
  3. @CachePut 可用于在不影响方法运行的情况下更新缓存
  4. @Caching 用于将多种缓存操作应用到一个方法中
  5. @CacheConfig 用于配置同一个类的缓存配置,类中的所有缓存都将共享这个配置
阅读更多
Spring Boot 集成 Caffeine 缓存
Shiro 方法上有权限注解的时候才鉴权

Shiro 方法上有权限注解的时候才鉴权

最近参与的新项目 REST API 需要集成 Shiro 权限框架,在集成过程中发现 Shiro 好像只能通过对过滤器指定 Url Path Pattern 的方式针对 URL 进行权限校验。在指定 Filter 的 URL 后,Fitler 会对所有的 URL 进行处理并不会根据需要对 URL 进行略过,但是 API 中并不是所有的接口都需要进行鉴权。

针对这个需求,翻遍了自带的默认过滤器都没有对应合适的 Filter 进行处理,只能自己实现 Filter,好在 Shiro 在扩展方面做得相当不错。本文主要讲述实现一个根据是否有权限注解来进行是否鉴权的方法,在没有 Shiro 权限注解的方法或者类上不进行鉴权。

阅读更多
并发编程的一些概念

并发编程的一些概念

在并发编程领域有一些名词我经常搞混淆,被问及也无法答出个所以然。所以在这里我把这些容易搞迷糊的概念整理一下,方便查阅。

阅读更多
Hello Kotlin

Hello Kotlin

很多人都喜欢从经典的 Hello world 程序开始介绍一门语言。这里我也贴上一个 Kotlin 的 Hello world 程序,虽然同样是运行在 JVM 上的程序,但是看起来与 Java 还是有很大的不同的。

1
2
3
4
5
// helloworld.kt
val name = "Kotlin"
fun main(args: Array<String>) {
println("hello, $name")
}
阅读更多