Java生态
Java基础
Java语言特性
Java是一种面向对象的编程语言,具有以下核心特性:
- 平台无关性:一次编写,到处运行
- 面向对象:封装、继承、多态
- 强类型:编译时类型检查
- 自动内存管理:垃圾回收机制
- 丰富的标准库:Java SE提供大量内置类库
JVM (Java Virtual Machine)
JVM是Java程序运行的核心,负责:
- 字节码执行
- 内存管理
- 垃圾回收
- 线程管理
Spring生态
Spring Framework
Spring是Java企业级应用开发的基础框架。
核心概念
- IoC (控制反转):依赖注入,对象创建由容器管理
- AOP (面向切面编程):横切关注点的模块化
- Bean生命周期:Spring容器管理的对象
基础配置
java
// 配置类
@Configuration
@ComponentScan("com.example")
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
// 服务类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findById(Long id) {
return userRepository.findById(id);
}
}
Spring Boot
Spring Boot简化了Spring应用的配置和部署。
自动配置
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 控制器
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
}
配置文件
yaml
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
server:
port: 8080
Spring Cloud
Spring Cloud提供微服务架构的解决方案。
服务注册与发现 (Eureka)
java
// 服务注册中心
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
// 服务提供者
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
配置中心 (Config)
java
// 配置客户端
@SpringBootApplication
@EnableConfigClient
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
网关 (Gateway)
java
@SpringBootApplication
@EnableGateway
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
// 路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
数据访问
Spring Data JPA
java
// 实体类
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String email;
// getters and setters
}
// 仓库接口
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
List<User> findByEmailContaining(String email);
}
MyBatis
java
// Mapper接口
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO users(username, email) VALUES(#{username}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}")
int update(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteById(Long id);
}
安全框架
Spring Security
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/api/**").authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
消息队列
Spring AMQP (RabbitMQ)
java
// 消息生产者
@Component
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend("exchange", "routing.key", message);
}
}
// 消息消费者
@Component
public class MessageConsumer {
@RabbitListener(queues = "queue.name")
public void handleMessage(String message) {
System.out.println("收到消息: " + message);
}
}
缓存
Spring Cache
java
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User findById(Long id) {
// 从数据库查询
return userRepository.findById(id);
}
@CacheEvict(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
}
测试
JUnit 5
java
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@Test
void shouldFindUserById() {
// Given
User user = new User();
user.setId(1L);
user.setUsername("test");
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
// When
User result = userService.findById(1L);
// Then
assertThat(result).isNotNull();
assertThat(result.getUsername()).isEqualTo("test");
}
}
部署
Docker
dockerfile
FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Maven
xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
性能优化
JVM调优
bash
# 启动参数
java -Xms2g -Xmx4g -XX:+UseG1GC -jar app.jar
连接池配置
yaml
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
Java生态是企业级应用开发的主流选择,Spring框架提供了完整的解决方案,从单体应用到微服务架构都有成熟的支持。