Spring boot 学习笔记2
Maven
- 项目管理工具:Maven 通过
pom.xml
(Project Object Model)文件描述项目配置,包括依赖、构建流程、插件等,实现项目标准化管理 - 依赖管理:自动下载并管理项目所需的第三方库(如 Spring、MyBatis),解决手动导入 Jar 包的繁琐问题。开发者只需在
pom.xml
中声明依赖坐标(GroupId、ArtifactId、Version),Maven 会从本地或远程仓库自动获取 - 构建自动化:提供编译、测试、打包、部署等一键式命令(如
mvn compile
、mvn package
),标准化构建流程
在 Maven 项目的 pom.xml
中配置镜像源(如阿里云、腾讯云等)主要是为了解决依赖下载速度慢、网络不稳定等问题,同时提升开发效率和团队协作的灵活性。
- Maven 默认从中央仓库(位于国外)下载依赖,国内访问速度慢,尤其对于大型项目或复杂依赖链,可能导致构建超时或失败
- 解决方案:在
pom.xml
中配置国内镜像源(如阿里云),将下载请求重定向到国内服务器,显著提升下载速度。例如:
1.@RequestParam
@RequestParam
是 Spring MVC 中的一个注解,用于将 HTTP 请求中的查询参数(Query Parameters)绑定到控制器方法的参数上。它非常适用于处理 GET
请求中的参数,但也可以用于其他类型的请求(如 POST
请求中的查询参数)。
示例代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ExampleController {@GetMapping("/search")public String search(@RequestParam String query) {return "You searched for: " + query;}
}
注意在查询时要通过查询参数添加参数
例如 http://localhost:8088/search?query=一万千
2.Jpa动态生成查询方法
通过 Spring Data JPA 的方法命名规则动态生成
例如
@Repository
public interface libraryListRepository extends JpaRepository<book, Integer> {List<book> findByTitleAndAuthor(String title, String author);}
会动态生成查询title和author的方法
3.@Configuration
@Configuration
是 Spring 框架中的一个注解,用于定义配置类。它是一个核心注解,用于替代传统的 XML 配置文件,提供了一种基于注解的方式来定义 Spring 容器中的 Bean 和配置信息
4.@Bean
@Bean
是 Spring 框架中的一个注解,用于在配置类中定义一个 Bean。它告诉 Spring 容器,该方法返回的对象应该被注册为一个 Bean,并且可以被其他组件使用。@Bean
注解通常与 @Configuration
注解一起使用,以声明式地定义 Spring 容器中的 Bean。
@Bean
注解的方法在 Spring 容器初始化时被调用,其返回的对象被注册为一个 Bean。Spring 容器会管理这些 Bean 的生命周期,包括初始化、依赖注入、销毁等。
5.@RequiredArgsConstructor
@RequiredArgsConstructor
会生成一个构造函数,该构造函数包含所有标记为 final
或使用 @NonNull
注解的字段。这样可以确保在创建对象时,这些字段必须被初始化,从而避免 null
值导致的潜在问题。
6.final
主要用于确保某些变量、方法或类在初始化后不能被修改
变量
-
不可变性:
final
修饰的变量在初始化后不能被重新赋值。 -
线程安全:
final
修饰的变量在多线程环境中是线程安全的,因为它们的值不会改变。
方法
-
不可覆盖:
final
修饰的方法不能被子类覆盖。 -
性能优化:在某些情况下,
final
方法可以被 JVM 优化,因为它们不会被覆盖。
7.依赖注入
依赖注入(Dependency Injection, DI)是 Spring 框架的核心功能之一,它允许你将对象的依赖关系由 Spring 容器来管理,而不是在对象内部直接创建或查找这些依赖。这种方式可以显著提高代码的可维护性、可测试性和松耦合性。
Spring 支持多种依赖注入的方式,主要包括:
构造器注入:
Setter 方法注入:
字段注入:
-
直接在字段上使用
@Autowired
注解注入依赖。 -
适用于非
final
字段,但不推荐在复杂场景中使用,因为它破坏了类的封装性。
依赖注入的步骤
-
使用
@Bean
注解在配置类中定义 Bean。
@Configuration
public class AppConfig {@Beanpublic MyService myService(AnotherService anotherService) {return new MyService(anotherService);}
}
-
在其他组件中,通过
@Autowired
注解注入所需的 Bean。
@Service
public class AnotherComponent {@Autowiredprivate MyService myService;public void doSomething() {myService.doSomething();}
}
如果存在多个相同类型的 Bean,Spring 会尝试通过以下方式解决歧义:
-
使用
@Qualifier
注解指定具体的 Bean。
@Autowired
@Qualifier("specificBean")
private MyService myService;
或者是定义Bean的优先级
@Repository,@Controller,@Service都会把接口或者类注册成Bean在需要时注入
@Autowired:自动注入依赖。
@Qualifier:解决依赖注入时的歧义问题。
@Primary:指定优先级较高的 Bean。
@Value:注入配置文件中的值或表达式。
@Resource:注入依赖,类似于 @Autowired。
@Inject:注入依赖,类似于 @Autowired。
@Configuration:标记配置类,定义和管理 Bean。
@Component:标记组件类,Spring 会自动扫描这些类并将它们注册为 Bean。
@Controller:标记控制器类,处理 HTTP 请求。
@Repository:标记数据访问层类,Spring 会自动处理数据访问层的异常。
@Service:标记服务层类,包含业务逻辑。
8.Ollama
在 Spring AI 中,Ollama 是一个用于管理大型语言模型(LLM)的工具
首先对于这个你要添加对应的依赖
//ollama的springai启动项
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId><version>${spring-ai.version}</version>
</dependency><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.1.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
@Bean
public ChatClient chatClient(OllamaChatModel model)
{return ChatClient.builder(model).defaultSystem("你是一个给书籍分类的工作人员").build();
}
注册一个bean就能使用了
9.调用ai接口
这里我调用的是moonshot模型,需要使用api可以去官网申请有免费的额度
<!--moonshot的依赖-->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-moonshot</artifactId><version>1.0.0-M7</version><type>pom</type>
</dependency>//如果说中央仓库没有这个依赖可以去阿里的镜像maven仓库
<repositories><repository><id>alimaven</id><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public</url></repository>
</repositories>
仓库服务
10.JPA
JPA(Java Persistence API)
JPA 是 Java EE 和 Java SE 的一部分,用于管理 Java 应用程序中的关系数据。它提供了一个标准的 ORM(对象关系映射)机制,允许开发者使用 Java 对象来操作数据库,而无需编写 SQL 语句。
@Entity
-
作用:标记一个类为 JPA 实体类,表示这个类映射到数据库中的一个表
@Table
-
作用:指定实体类映射到数据库中的表名。
@Id
-
作用:标记实体类中的主键字段。
@GeneratedValue
-
作用:指定主键的生成策略。
@Column
-
作用:指定实体类中的字段映射到数据库表中的列。
@Modifying
-
作用:标记一个方法为修改操作(如
UPDATE
或DELETE
),通常用于自定义的@Query
注解方法。
@Query
-
作用:定义一个自定义的 JPQL 查询。
@Param
-
作用:为查询方法中的命名参数指定名称。
基于命名方法的查询
Spring Data JPA 提供了一种非常方便的方式来定义查询方法,只需根据方法名称的命名规则来定义方法即可。Spring Data JPA 会根据方法名称自动生成相应的查询。
示例
import org.springframework.data.jpa.repository.JpaRepository;public interface MessageBoardRepository extends JpaRepository<MessageBoard, Long> {int findLikesById(Long id);
}
11.JPQL
JPQL 是 Java Persistence Query Language 的缩写,它是 JPA(Java Persistence API)的一部分,用于操作持久化实体的查询语言。JPQL 与 SQL 类似,但它操作的是实体类及其属性,而不是数据库表及其列。这使得 JPQL 更加面向对象,与 Java 实体类的映射关系更加紧密。
JPQL 的特点
-
面向对象:JPQL 操作的是实体类及其属性,而不是数据库表及其列。
-
类型安全:JPQL 查询在编译时会进行类型检查,减少运行时错误。
-
与数据库无关:JPQL 是一种高级抽象,与具体的数据库无关,便于在不同数据库之间迁移。
-
集成性:JPQL 与 JPA 的其他功能(如实体管理器、事务管理等)无缝集成。
SELECT m FROM MessageBoard m
@Transactional 的作用
@Transactional
注解用于声明事务管理。它告诉 Spring 框架,被注解的方法应该在一个事务上下文中执行。如果方法执行过程中发生异常,事务将会回滚,确保数据的一致性。
何时需要使用 @Transactional
-
执行更新操作:当你执行
INSERT
、UPDATE
、DELETE
等修改数据库的操作时,通常需要使用@Transactional
注解。这是因为这些操作需要在一个事务中执行,以确保数据的一致性。 -
执行复杂查询:如果你的查询操作涉及多个数据库操作,或者需要在查询后进行一些修改操作,使用
@Transactional
可以确保这些操作在一个事务中完成。 -
默认事务管理:即使你的方法不直接执行更新操作,但调用了其他可能修改数据库的方法,使用
@Transactional
可以确保事务的一致性。
12.事务
事务管理的基本概念
事务是数据库操作的一个基本单位,它确保一系列操作要么全部成功,要么全部失败,从而保证数据的一致性。事务具有以下四个特性(ACID):
-
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
-
一致性(Consistency):事务执行前后,数据库的状态保持一致。
-
隔离性(Isolation):多个事务并发执行时,每个事务看到的数据是一致的,不会受到其他事务的干扰。
-
持久性(Durability):事务提交后,其结果是永久性的,即使系统发生故障也不会丢失。
@Transactional 注解的作用
@Transactional
注解用于声明事务管理。它告诉 Spring 框架,被注解的方法应该在一个事务上下文中执行。具体来说:
-
事务的开始:当方法被调用时,Spring 框架会自动开启一个新的事务。
-
事务的提交:如果方法正常执行完成,Spring 框架会提交事务,将所有操作永久保存到数据库中。
-
事务的回滚:如果方法执行过程中抛出异常,Spring 框架会回滚事务,撤销所有操作,确保数据库状态保持一致。