以下是补充了Java最新技术和框架实操内容的完整文章:
推荐使用 SDKMAN! 管理Java版本:
# 安装SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 安装Java 17 LTS
sdk install java 17.0.8-tem
sdk default java 17.0.8-tem
--enable-preview
// 旧写法
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// 新模式匹配
if (obj instanceof String s) {
System.out.println(s.length());
}
// 结合switch表达式
Object obj = LocalDate.now();
int hashCode = switch (obj) {
case String s -> s.hashCode();
case Integer i -> i.hashCode();
case LocalDate d -> d.getDayOfMonth();
default -> obj.toString().hashCode();
};
// 旧写法
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, World!</p>\n" +
" </body>\n" +
"</html>";
// 文本块写法
String html = """
<html>
<body>
<p>Hello, World!</p>
</body>
</html>
""";
// 传统JavaBean
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters, equals, hashCode, toString
}
// 记录类写法
record Person(String name, int age) {}
使用Spring Initializr快速创建项目:
curl https://start.spring.io/starter.tgz -d dependencies=web,data-jpa,validation,actuator -d javaVersion=17 -d type=maven-project -d groupId=com.example -d artifactId=demo -d name=demo | tar -xzvf -
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody UserRequest request) {
User user = userService.createUser(request);
return ResponseEntity.created(URI.create("/api/users/" + user.getId())).body(user);
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return userService.getUserById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
}
// 验证注解示例
public record UserRequest(
@NotBlank(message = "姓名不能为空")
String name,
@Email(message = "邮箱格式不正确")
String email,
@Min(value = 18, message = "必须年满18岁")
Integer age
) {}
# application.yml
spring:
application:
name: user-service
profiles:
active: dev
# application-dev.yml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/user_db
username: postgres
password: password
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
# application-prod.yml
spring:
datasource:
url: jdbc:postgresql://prod-db:5432/user_db
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
@RestController
@RequestMapping("/api/books")
public class BookController {
@Autowired
private BookRepository bookRepository;
@GetMapping
public Flux<Book> getAllBooks() {
return bookRepository.findAll();
}
@PostMapping
public Mono<Book> createBook(@RequestBody Book book) {
return bookRepository.save(book);
}
}
// 响应式Repository
public interface BookRepository extends ReactiveCrudRepository<Book, String> {
Flux<Book> findByAuthor(String author);
}
@WebFluxTest(BookController.class)
class BookControllerTest {
@Autowired
private WebTestClient webTestClient;
@MockBean
private BookRepository bookRepository;
@Test
void shouldReturnAllBooks() {
Book book = new Book("1", "Java 17", "Doubao");
when(bookRepository.findAll()).thenReturn(Flux.just(book));
webTestClient.get().uri("/api/books")
.exchange()
.expectStatus().isOk()
.expectBodyList(Book.class)
.contains(book);
}
}
# 基础镜像
FROM eclipse-temurin:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
# 下载依赖
RUN ./mvnw dependency:go-offline -B
# 复制源代码
COPY src src
# 构建应用
RUN ./mvnw package -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
# 创建运行时镜像
FROM eclipse-temurin:17-jre-alpine
VOLUME /tmp
ARG DEPENDENCY=/app/target/dependency
COPY --from=0 ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=0 ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=0 ${DEPENDENCY}/BOOT-INF/classes /app
# 暴露端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.demo.DemoApplication"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
labels:
app: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: doubao/user-service:1.0.0
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private UserRepository userRepository;
@Test
void shouldCreateUser() throws Exception {
UserRequest request = new UserRequest("Doubao", "doubao@example.com", 20);
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isCreated())
.andExpect(header().string("Location", containsString("/api/users/")));
assertThat(userRepository.count()).isEqualTo(1);
}
}
name: Java CI with Maven
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run Tests
run: mvn test
- name: Build Docker Image
if: github.ref == 'refs/heads/main'
uses: docker/build-push-action@v5
with:
context: .
push: false
tags: doubao/user-service:${{ github.sha }}
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: target
path: target/*.jar
通过以上实操内容,你可以系统性地学习Java最新技术栈,从语言特性到微服务架构,再到云原生部署,形成完整的知识体系。建议按照从基础到高级的顺序逐步实践,并结合官方文档深入理解每个技术点的原理和最佳实践。
Java 最新技术,Spring Boot 3.x,MyBatis-Plus,Java 框架实操,Java 从入门到精通,Spring Boot 实战教程,MyBatis-Plus 实战,Java 开发,微服务架构,热门框架,编程教程,技术指南,框架应用,代码实操,Java 技术升级
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。