java开发必备知识(五)

本文介绍了Java项目开发中的一些核心概念和技术,包括线程的activeCount和yield方法,线程安全的AtomicInteger,文件路径分隔符File.separator,线程安全的随机数生成器ThreadLocalRandom,日期时间格式化DateTimeFormatter,UUID的生成,SpringTask定时任务,JWT令牌的创建,以及UserDetails在SpringSecurity中的作用。同时,提到了@ServletComponentScan、@SpringBootApplication等SpringBoot注解,以及缓存管理和服务发现功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

掌握实战项目各种开发过程


学习内容:

某某项目的源码实操,记录常用的“姿势”,

例如:

  1. 架构设计
  2. 掌握 Java 基本语法
  3. 分析各种常用的类以及方法
  4. 掌握开发必备技巧
  5. 分析源码

学习时间:

7.18、7.19


项目涉及的方法

Thread.activeCount()

用于获取当前活跃的线程数。当一个 Java 程序启动时,至少会有一个主线程在运行,因此 Thread.activeCount() 的返回值至少为 1。

Thread.yield()

让出当前线程的 CPU 时间片,让其他线程有机会运行。当一个线程调用 Thread.yield() 方法时,它将释放当前的 CPU 时间片,并重新竞争 CPU 时间片的执行权。

CPU 时间片

CPU 时间片(CPU Time Slice)是指操作系统分配给每个线程或进程的 CPU 运行时间。在多任务操作系统中,操作系统会将 CPU 时间片分配给不同的线程或进程,以便它们可以轮流执行。

AtomicInteger

原子性整数类,可以实现线程安全的整数操作。AtomicInteger 内部使用了 CAS算法,保证了对整数的操作是原子性的,不会出现线程安全问题。
使用 AtomicInteger 可以避免多线程环境下对同一个整数变量进行操作时出现的线程安全问题,例如竞争条件、死锁等。
此外,AtomicInteger 还可以提高程序的性能,因为它使用了硬件级别的原子性操作,避免了锁的竞争,从而提高了程序的并发性能。
如果需要保证多个操作的原子性,可以使用 AtomicLong 或者 AtomicReference 等原子性类来实现。

File.separator

File.separator 是 Java 中用于表示文件路径分隔符的常量。

在不同的操作系统中,文件路径分隔符可能不同,例如在 Windows 系统中使用的是反斜杠(\),而在 Unix/Linux 系统中使用的是正斜杠(/)。通过使用 File.separator 常量,可以使代码在不同操作系统中都能正常工作,而无需关心不同操作系统的差异。

File file = new File("path" + File.separator + "to" + File.separator + "file");
// File.separator 常量来连接文件路径,从而**保证代码在不同的操作系统中都能正常工作。**

ThreadLocalRandom.current()

线程安全的随机数生成器,用于生成高效的、线程安全的随机数。使用 ThreadLocalRandom.current() 方法可以获取当前线程的 ThreadLocalRandom 实例。

DateTimeFormatter.ofPattern

Java 中用于创建日期时间格式化对象的方法之一,它的作用是创建一个指定格式的日期时间格式化器,用于将日期时间对象格式化为字符串或将字符串解析为日期时间对象。

y 表示年份,可以是 1 位、2 位或 4 位数字。
M 表示月份,可以是 1 位或 2 位数字。
d 表示日期,可以是 1 位或 2 位数字。
H 表示小时,24 小时制,可以是 1 位或 2 位数字。
m 表示分钟,可以是 1 位或 2 位数字。
s 表示秒数,可以是 1 位或 2 位数字。
S 表示毫秒数,可以是 1 位、2 位或 3 位数字。

LocalDateTime dateTime = LocalDateTime.now();
String year = dateTime.format(DateTimeFormatter.ofPattern("yyyy"));
System.out.println(year);

new UUID(random.nextLong(), random.nextLong())

java.util.UUID 类的构造方法,用于生成一个随机的 UUID

通过调用 random.nextLong() 方法生成两个随机的 long 类型的数,作为 UUID 的高位和低位,然后使用这两个数构造一个 UUID 对象。

实现定时任务

Spring Task 是 Spring 提供的轻量级定时任务工具,不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。

实现JWT的token

先创建一个JwtTokenUtil

 private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);
 然后再里边定义一个Logger来记录这个类的日志信息

生成token,要利用JWT库的方法,如

  return Jwts.builder()
                .setClaims(claims)
                // Map 类型的 claims 参数,它包含了 JWT 中的声明信息
                .setExpiration(generateExpirationDate())
                .signWith(SignatureAlgorithm.HS512, secret)
//                 signWith() 方法来设置 JWT 的签名算法和密钥。
                .compact();
//        compact() 方法来生成 JWT 字符串,并将其返回。

JwtBuilder接口

public interface JwtBuilder extends ClaimsMutator<JwtBuilder>

JwtBuilder 的接口,它扩展了 ClaimsMutator 接口,用于创建和设置 JWT 的各种参数。
具体来说,该接口提供了一系列方法来设置 JWT 的声明信息、过期时间、签发时间、ID 等参数,并最终生成 JWT 字符串。

setSubject(String subject):设置 JWT 的主题(Subject)信息。
setIssuer(String issuer):设置 JWT 的签发者(Issuer)信息。
setAudience(String... audience):设置 JWT 的受众(Audience)信息。
setExpiration(Date expiration):设置 JWT 的过期时间。
setNotBefore(Date notBefore):设置 JWT 的生效时间。
setId(String id):设置 JWTIDsignWith(SignatureAlgorithm alg, byte[] secret):使用指定的签名算法和密钥对 JWT 进行签名。
compact():生成 JWT 字符串。

需要注意的是,JwtBuilder 接口中的 setExpiration() 方法、setNotBefore() 方法和 signWith() 方法是必需的,因为它们对于 JWT 的正确性和安全性非常重要。
setExpiration() 方法用于设置 JWT 的过期时间,以避免 JWT 在过期后继续使用;
setNotBefore() 方法用于设置 JWT 的生效时间,以防止 JWT 在生效前被使用;
signWith() 方法用于对 JWT 进行签名,以保证 JWT 的完整性和真实性。

UserDetails接口

在 Spring Security 中,UserDetails 接口是一个核心接口,用于表示用户的认证和授权信息,包括用户名、密码、角色、权限等信息。

package **org.springframework.security.core.userdetails;**
public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    String getPassword();

    String getUsername();

    boolean isAccountNonExpired();

    boolean isAccountNonLocked();

    boolean isCredentialsNonExpired();

    boolean isEnabled();
}

项目涉及的注解

@ServletComponentScan

是 Spring Boot 中的一个注解,用于自动扫描 Servlet、Filter 和 Listener 组件,并将它们注册到 Servlet 容器中。

@ServletComponentScan 注解只能扫描标注了 @WebServlet、@WebFilter 和 @WebListener 注解的组件,不能扫描其他类型的组件。

如果需要扫描其他类型的组件,可以使用 @ComponentScan 注解来进行自动扫描。

@SpringBootApplication

@SpringBootApplication 是一个注解,它结合了三个注解:@SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。

  1. @SpringBootConfiguration 是 Spring Boot 的配置类注解,它标注这个类是 Spring Boot 的配置类,用于配置 Spring Boot 应用。
  2. @EnableAutoConfiguration 是 Spring Boot 的自动配置注解,它能够自动根据类路径下的 jar 包、类文件以及其他设置来配置 Spring 应用。
  3. @ComponentScan 是 Spring 的组件扫描注解,它能够自动扫描指定包及其子包下的所有组件,包括被 @Component、@Controller、@Service 和 @Repository 等注解标记的组件,然后将它们装配到 Spring 容器中。

@EnableCaching

@EnableCaching 注解用于启用 Spring Boot 应用程序的缓存功能。使用 @EnableCaching 注解后,可以在应用程序中使用 Spring Cache 抽象层提供的缓存功能。
例如使用 @Cacheable、@CachePut、@CacheEvict 等注解来实现缓存

@EnableDiscoveryClient

用于启用 Spring Cloud 应用程序的服务发现功能。

使用 @EnableDiscoveryClient 注解后,应用程序可以通过注册中心发现其他的服务实例,并提供服务调用和负载均衡等功能

项目涉及的知识点

高位和低位

假设某个 UUID 的十六进制表示为:

b3b6cd1a-1e3c-4c0b-8e68-4a8d0d3d5c3d
//将这个 UUID 拆分成高位和低位,可以按照以下方式进行:

高位:b3b6cd1a1e3c4c0b
低位:8e684a8d0d3d5c3d

需要注意的是,高位和低位并没有具体的意义,它们只是用于标识 UUID 的唯一性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值