Appearance
Spring Boot学习笔记 
创建项目 
可以通过spring.io[https://start.spring.io/]下载需要的包,也可以通过vscode提供的插件来开始一个新的项目。
在开始一个新的maven项目后,通过配置application.properties来设置数据库:
properties
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver注意要在pom.xml中添加最新的mysql-connector-java驱动
xml
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.34</version> <!-- 使用最新稳定版本 -->
</dependency>执行mvn install来安装依赖
Maven 
maven是一个构建工具,可以用来管理项目的依赖和构建过程。它使用pom.xml文件来描述项目的结构、依赖关系以及构建配置。
常用命令 
- mvn -DskipTests=true clean install: 跳过测试并安装项目
- mvn -DskipTests=true clean package: 跳过测试并构建项目,打包为jar或war文件
也可以分别执行以下命令:
- mvn clean: 删除target目录下的所有内容
- mvn compile: 编译源代码
- mvn test: 运行测试
- mvn package: 将项目打包成jar或war文件
- mvn install: 将项目安装到本地仓库
核心注解 
组件注解 
- @Component: 通用的Spring组件,被Spring容器管理
- @Service: 业务逻辑层组件,是- @Component的特化
- @Repository: 数据访问层组件
- @Controller: 控制器组件,处理HTTP请求
- @Configuration: 配置类,用于定义Bean
依赖注入 
- @Autowired: Spring提供的自动装配,按类型注入
- @Resource: Java的标准注解,按名称注入,JSR-250标准
- @Value: 注入配置属性值
java
@Service
public class UserService {
    @Resource
    private UserRepository userRepository;
    @Value("${app.default.timeout:5000}")
    private int timeout;
}配置相关 
- @Bean: 在配置类中定义Bean
- @ConfigurationProperties: 绑定配置属性到对象
java
@Configuration
public class AppConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}事件驱动编程 
Spring提供了强大的事件机制,支持松耦合的组件通信。
事件定义 
java
public class UserRegisteredEvent extends ApplicationEvent {
    private final String username;
    public UserRegisteredEvent(Object source, String username) {
        super(source);
        this.username = username;
    }
}事件发布 
java
@Service
public class UserService {
    @Resource
    private ApplicationEventPublisher eventPublisher;
    public void registerUser(String username) {
        // 业务逻辑
        eventPublisher.publishEvent(new UserRegisteredEvent(this, username));
    }
}事件监听 
java
@Component
public class EmailService {
    @EventListener
    public void handleUserRegistered(UserRegisteredEvent event) {
        // 发送欢迎邮件
        sendWelcomeEmail(event.getUsername());
    }
}Kafka集成 
Spring Boot通过spring-kafka提供了Kafka的便捷集成。
依赖配置 
xml
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>配置属性 
properties
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest消息消费 
java
@Component
public class MessageConsumer {
    @KafkaListener(topics = "user-events", groupId = "user-service")
    public void handleMessage(String message) {
        log.info("收到消息: {}", message);
    }
}消息发送 
java
@Service
public class MessageProducer {
    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;
    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
    }
}设计模式 
Builder模式 
Builder模式的目的是为了创建复杂对象,通过链式调用方法来设置对象的属性,最后调用build方法来创建对象。从而避免了构造函数参数过多的问题。
java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MetricInputMessage {
    private String modelName;
    private String instance;
    private Instant timestamp;
    private String metricName;
    private String value;
}
// 使用示例
MetricInputMessage message = MetricInputMessage.builder()
    .modelName("fault_prediction_model")
    .instance("instance-001")
    .timestamp(Instant.now())
    .metricName("cpu_usage")
    .value("85.5")
    .build();策略模式 
通过接口定义算法族,让算法的变化独立于使用算法的客户端。
java
public interface MetricFilter {
    boolean shouldProcess(MetricInputMessage message);
    String getFilterName();
    default int getPriority() { return 100; }
}
@Component
public class MetricNameFilter implements MetricFilter {
    @Override
    public boolean shouldProcess(MetricInputMessage message) {
        return message.getMetricName() != null;
    }
    @Override
    public String getFilterName() {
        return "MetricNameFilter";
    }
}适配器模式 
将不兼容的接口转换为客户端期望的接口。
java
@Component
public class KafkaAdapter {
    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;
    public void sendMetric(MetricInputMessage metric) {
        String message = JSON.toJSONString(metric);
        kafkaTemplate.send("metrics-input", message);
    }
    @KafkaListener(topics = "prediction-results")
    public void handleResult(String message) {
        // 处理预测结果
    }
}异步处理 
CompletableFuture 
Java 8引入的异步编程工具,支持链式调用和组合操作。
java
@Service
public class AsyncService {
    public CompletableFuture<String> processAsync(String input) {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "处理结果: " + input;
        });
    }
}@Async注解 
Spring提供的异步方法注解。
java
@Service
public class EmailService {
    @Async
    public CompletableFuture<Void> sendEmailAsync(String to, String content) {
        // 发送邮件逻辑
        return CompletableFuture.completedFuture(null);
    }
}配置管理 
外部化配置 
通过@Value注解注入配置值:
java
@Service
public class AiService {
    @Value("${ai.model.default:fault_prediction_model}")
    private String defaultModel;
    @Value("${ai.kafka.topics.metrics-input:metrics-input}")
    private String metricsInputTopic;
}配置属性绑定 
使用@ConfigurationProperties绑定复杂配置:
java
@ConfigurationProperties(prefix = "ai.kafka")
@Data
public class KafkaProperties {
    private String bootstrapServers;
    private String groupId;
    private Topics topics = new Topics();
    @Data
    public static class Topics {
        private String metricsInput = "metrics-input";
        private String predictionResults = "prediction-results";
    }
}过滤器链模式 
实现可配置的过滤器链,支持优先级排序:
java
@Configuration
public class FilterConfig {
    @Bean
    public List<MetricFilter> orderedFilters(List<MetricFilter> filters) {
        return filters.stream()
            .sorted(Comparator.comparingInt(MetricFilter::getPriority))
            .collect(Collectors.toList());
    }
}
// 使用过滤器链
private boolean shouldProcess(MetricInputMessage message) {
    return filters.stream()
        .allMatch(filter -> filter.shouldProcess(message));
}最佳实践 
- 合理使用注解: 选择合适的组件注解(@Service,@Component,@Repository)
- 依赖注入: 优先使用@Resource按名称注入,避免循环依赖
- 配置外部化: 使用@Value和@ConfigurationProperties管理配置
- 事件驱动: 通过Spring事件机制实现松耦合
- 异步处理: 使用@Async或CompletableFuture处理耗时操作
- 异常处理: 在关键位置添加try-catch和日志记录
