<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-spring-boot-app</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>My Spring Boot App</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' } test { useJUnitPlatform() } |
server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 logging.level.com.example=DEBUG |
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: 123456 logging: level: com.example: DEBUG |
@Component public class MyBean { @Value("${my.property}") private String myProperty; // getter and setter } |
my: property1: value1 property2: value2 |
@Component @ConfigurationProperties(prefix = "my") public class MyConfig { private String property1; private String property2; // getters and setters } |
spring: datasource: url: jdbc:mysql://localhost:3306/dev_mydb username: dev_user password: dev_password logging: level: com.example: DEBUG |
spring: datasource: url: jdbc:mysql://prod_host:3306/prod_mydb username: prod_user password: prod_password logging: level: com.example: INFO |
@Configuration @Profile("dev") public class DevConfig { // 开辟环境下的 bean 配置 } @Configuration @Profile("prod") public class ProdConfig { // 生产环境下的 bean 配置 } |
@RestController @RequestMapping("/users") public class UserController { // 模仿一个用户列表,实际应用中应该从数据库获取 private static List<User> userList = new ArrayList<>(); // 利用@GetMapping注解处置惩罚GET哀求,用于获取用户列表 @GetMapping public List<User> getUsers() { return userList; } // 利用@PostMapping注解处置惩罚POST哀求,用于创建新用户 @PostMapping public User createUser(@RequestBody User user) { userList.add(user); return user; } // 利用@PutMapping注解处置惩罚PUT哀求,用于更新用户信息 @PutMapping("/{id}") public User updateUser(@PathVariable Long id, @RequestBody User user) { // 根据id找到对应的用户并更新信息 for (User u : userList) { if (u.getId().equals(id)) { u.setName(user.getName()); u.setAge(user.getAge()); return u; } } return null; } // 利用@DeleteMapping注解处置惩罚DELETE哀求,用于删除用户 @DeleteMapping("/{id}") public void deleteUser(@PathVariable Long id) { // 根据id找到对应的用户并从列表中移除 userList.removeIf(user -> user.getId().equals(id)); } } |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> |
# 关闭模板缓存,方便在开辟过程中实时看到模板的修改结果 spring.thymeleaf.cache=false # 设置模板文件的前缀,通常为classpath:/templates/,表示模板文件在resources/templates目次下 spring.thymeleaf.prefix=classpath:/templates/ # 设置模板文件的后缀为.html spring.thymeleaf.suffix=.html |
@Controller @RequestMapping("/views") public class ViewController { @GetMapping("/user") public String getUserView(Model model) { // 创建一个用户对象 User user = new User(1L, "John Doe", 30); // 将用户对象添加到模子中,以便在模板中利用 model.addAttribute("user", user); // 返回视图名称,Thymeleaf会主动在templates目次下查找对应的.html文件 return "user"; } } |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>User Information</title> </head> <body> <h1>User Details</h1> <p th:text="'ID: ' + ${user.id}"></p> <p th:text="'Name: ' + ${user.name}"></p> <p th:text="'Age: ' + ${user.age}"></p> </body> </html> |
# messages.properties greeting=Hello |
# messages_en.properties greeting=Hello |
# messages_zh_CN.properties greeting=你好 |
# 设置国际化资源文件的基础名称 spring.messages.basename=messages # 设置默认语言 spring.messages.fallback-to-system-locale=false spring.messages.default-encoding=UTF-8 |
@RestController public class InternationalizationController { @Autowired private MessageSource messageSource; @GetMapping("/greeting") public String greeting(@RequestHeader("Accept-Language") Locale locale) { // 根据客户端哀求的语言获取对应的国际化文本 return messageSource.getMessage("greeting", null, locale); } } |
# 数据库连接URL spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC # 数据库用户名 spring.datasource.username=root # 数据库暗码 spring.datasource.password=123456 # 数据库驱动类名 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
# 最大连接数 spring.datasource.hikari.maximum-pool-size=10 # 最小连接数 spring.datasource.hikari.minimum-idle=5 # 空闲连接超时时间(毫秒) spring.datasource.hikari.idle-timeout=600000 # 连接超时时间(毫秒) spring.datasource.hikari.connection-timeout=30000 # 连接池名称 spring.datasource.hikari.pool-name=MyHikariCP |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> |
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // 省略getter和setter方法 } |
public interface UserRepository extends JpaRepository<User, Long> { // 可以在这里定义自定义查询方法 } |
@Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsers() { return userRepository.findAll(); } public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } public User saveUser(User user) { return userRepository.save(user); } public void deleteUser(Long id) { userRepository.deleteById(id); } } |
public interface UserRepository extends JpaRepository<User, Long> { // 根据年龄范围查询用户 List<User> findByAgeBetween(Integer minAge, Integer maxAge); // 利用@Query注解自定义查询语句 @Query("SELECT u FROM User u WHERE u.name LIKE %?1%") List<User> findByNameContaining(String name); } |
@Service public class UserRegistrationService { @Autowired private UserRepository userRepository; @Autowired private UserConfigRepository userConfigRepository; @Transactional public void registerUser(User user, UserConfig userConfig) { // 生存用户信息 User savedUser = userRepository.save(user); // 设置用户配置的用户ID userConfig.setUserId(savedUser.getId()); // 生存用户配置信息 userConfigRepository.save(userConfig); } } |
@SpringBootApplication @EnableCaching public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> |
# Redis服务器地点 spring.redis.host=localhost # Redis服务器端口 spring.redis.port=6379 # Redis数据库索引(默认为0) spring.redis.database=0 # 连接超时时间(毫秒) spring.redis.timeout=5000 # Redis连接池最大连接数 spring.redis.lettuce.pool.max-active=8 # Redis连接池最大空闲连接数 spring.redis.lettuce.pool.max-idle=8 # Redis连接池最小空闲连接数 spring.redis.lettuce.pool.min-idle=0 |
@Service public class UserService { @Autowired private UserRepository userRepository; @Cacheable(cacheNames = "users", key = "#id") public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } } |
@CachePut(cacheNames = "users", key = "#user.id") public User updateUser(User user) { return userRepository.save(user); } |
@CacheEvict(cacheNames = "users", key = "#id") public void deleteUser(Long id) { userRepository.deleteById(id); } |
<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> |
# Kafka服务器地点 spring.kafka.bootstrap-servers=localhost:9092 # 生产者配置 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer # 消费者配置 spring.kafka.consumer.group-id=my-group spring.kafka.consumer.auto-offset-reset=earliest spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> |
# RabbitMQ服务器地点 spring.rabbitmq.host=localhost # RabbitMQ服务器端口 spring.rabbitmq.port=5672 # 用户名 spring.rabbitmq.username=guest # 暗码 spring.rabbitmq.password=guest # 虚拟主机 spring.rabbitmq.virtual-host=/ |
@Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } // 假设用户的权限信息存储在 user.getRoles() 中,这里将其转换为 Spring Security 可以大概识别的 GrantedAuthority 列表 List<GrantedAuthority> authorities = user.getRoles().stream() .map(role -> new SimpleGrantedAuthority(role.getName())) .collect(Collectors.toList()); return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities); } } |
@RestController @RequestMapping("/api") public class UserController { // 只有具有 'ADMIN' 脚色的用户才气访问此方法 @PreAuthorize("hasRole('ADMIN')") @GetMapping("/users") public List<User> getUsers() { // 返回用户列表 return userService.getUsers(); } // 只有具有 'USER' 脚色的用户才气访问此方法 @PreAuthorize("hasRole('USER')") @GetMapping("/profile") public User getUserProfile() { // 返回用户个人资料 return userService.getUserProfile(); } // 具有 'ADMIN' 或 'USER' 脚色的用户才气访问此方法 @PreAuthorize("hasAnyRole('ADMIN', 'USER')") @PostMapping("/users") public User createUser(@RequestBody User user) { // 创建新用户 return userService.createUser(user); } } |
@Service public class CustomPermissionService { public boolean hasCustomPermission(String permission) { // 这里可以根据业务逻辑来判定用户是否具有特定的权限 // 比方,从数据库或其他数据源获取用户的权限信息举行验证 return false; } } |
@RestController @RequestMapping("/api") public class SomeController { @Autowired private CustomPermissionService permissionService; // 利用自定义的权限验证方法,只有当用户具有特定的自定义权限时才气访问此方法 @PreAuthorize("@permissionService.hasCustomPermission('custom_permission')") @GetMapping("/someResource") public String getSomeResource() { return "This is a protected resource"; } } |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> |
@Configuration public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); // 可以调整 cost factor,这里设置为 12 } } |
@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; public void registerUser(User user) { String hashedPassword = passwordEncoder.encode(user.getPassword()); user.setPassword(hashedPassword); userRepository.save(user); } } |
@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; public boolean authenticate(String username, String password) { User user = userRepository.findByUsername(username); if (user!= null) { return passwordEncoder.matches(password, user.getPassword()); } return false; } } |
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class CalculatorTest { private Calculator calculator; @BeforeEach public void setUp() { calculator = new Calculator(); } @Test public void testAdd() { int result = calculator.add(2, 3); assertEquals(5, result); } @Test public void testSubtract() { int result = calculator.subtract(5, 3); assertEquals(2, result); } } |
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; public class UserServiceTest { @Test public void testGetUserById() { // 创建模仿的 UserRepository UserRepository userRepository = mock(UserRepository.class); // 创建 UserService 并注入模仿的 UserRepository UserService userService = new UserService(userRepository); // 创建一个虚拟的用户对象 User mockUser = new User(1L, "John Doe", 30); // 定义模仿对象的举动,当调用 findById(1L) 时返回虚拟用户对象 when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)); // 调用需要测试的方法 User user = userService.getUserById(1L); // 验证返回结果 assertEquals("John Doe", user.getName()); // 验证 findById(1L) 方法被调用了一次 verify(userRepository).findById(1L); } } |
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc public class UserControllerIntegrationTest { @Autowired private MockMvc mockMvc; @Test public void testGetUserById() throws Exception { mockMvc.perform(get("/users/{id}", 1)) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("John Doe")) .andExpect(jsonPath("$.age").value(30)); } } |
import io.restassured.RestAssured; import io.restassured.response.Response; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class UserControllerRestAssuredTest { @Test public void testGetUserById() { Response response = RestAssured.get("http://localhost:8080/users/{id}", 1); assertEquals(200, response.getStatusCode()); assertEquals("John Doe", response.jsonPath().getString("name")); assertEquals(30, response.jsonPath().getInt("age")); } } |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> |
implementation 'org.springframework.boot:spring-boot-starter-actuator' |
management.endpoints.web.exposure.include=health,info,metrics |
management: endpoints: web: exposure: include: health,info,metrics |
management.endpoints.web.base-path=/manage |
{ "status": "UP" } |
{ "status": "DOWN", "components": { "db": { "status": "DOWN", "details": { "error": "org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution" } }, "diskSpace": { "status": "UP", "details": { "total": 250685575168, "free": 118964342784, "threshold": 10485760 } } } } |
{ "http.server.requests": 100, "system.cpu.usage": 0.65, "jvm.memory.used": 52428800, "myapp.sales.total": 10000 } |
{ "app": { "version": "1.0.0", "buildTime": "2024-01-01T00:00:00", "author": "John Doe", "copyright": "Copyright © 2024 Company Name" |
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |