Spring Boot 是一个开源的 Java 框架,用于快速开发独立的、生产级的 Spring 应用程序。它提供了一系列的自动化配置和约定,简化了开发流程。
模块化设计:
在 Spring Boot 中,我们可以使用 @SpringBootApplication 注解来启动应用程序,而 @ComponentScan 注解则使得 Spring 可以扫描到项目的组件。这样可以将项目划分为多个模块,每个模块都有自己的职责。例如:我们可以创建一个服务模块用于实现业务逻辑,一个数据访问模块用于与数据库交互等。这种设计方式使得项目结构清晰,维护方便。代码示例:
java复制代码
@SpringBootApplication(scanBasePackages = {"com.example.demo"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
SOLID原则:
Spring Boot 支持依赖注入和面向切面编程(AOP),这使得我们可以更好的遵循 SOLID 原则。通过使用 @Autowired 注解可以实现依赖注入,而 AOP 则可以帮助我们实现横切关注点的分离。例如:我们可以创建一个切面用于记录方法的执行时间,从而抽取出对日志的关注点。代码示例:
java复制代码
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ...其他代码...
}
设计模式:依赖注入和工厂模式:
java复制代码
@Configuration
public class DataSourceConfig {
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
java复制代码
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findUserById(Long id) {
return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException("User not found"));
}
}
异常处理:
在 Java 中,我们通常使用 try-catch 语句块来捕获和处理异常。在 Spring Boot 中,也可以使用 @ExceptionHandler 注解来处理异常。例如:我们可以在控制器类中创建一个方法来处理自定义的异常。代码示例:
java复制代码
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorDTO handleUserNotFoundException(UserNotFoundException e) {
return new ErrorDTO(e.getMessage(), HttpStatus.NOT_FOUND);
}
}
Spring Boot 提供了一套完整的测试框架,包括单元测试、集成测试和端到端测试。我们可以使用 @SpringBootTest 注解来创建一个集成测试类,并使用 @MockBean 注解来模拟 Spring Bean。代码示例:
java复制代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
class DemoApplicationTests {
@Autowired
private UserService userService;
@Test
public void testFindUserById() {
Long id = 1L;
User user = new User();
user.setId(id);
user.setName("test");
user.setAge(18);
when(userRepository.findById(any())).thenReturn(Optional.of(user));
assertEquals(user, userService.findUserById(id));
}
}