Spring Boot 的常用注解
@SpringBootApplication:主要用于启动类上,标明该类是 Spring Boot 应用的入口。
@Controller:标识一个类是 Spring MVC 控制器。
@RestController:与 @Controller 相似,但是返回的结果是 JSON/XML 等,而不是视图。
@Service:标识一个类是业务逻辑层。
@Repository:标识一个类是 DAO 层。
@Autowired:自动装配 Bean。
@Value:自动装配配置文件中的属性值。
8.@Transactional:事务注解
2.@Transactional 注解 啥时候会回滚
在 Spring 中,@Transactional 注解可以用来标记一个方法或类的方法,使它们成为事务性操作。当标记了 @Transactional 的方法出现异常时,Spring 将会回滚事务。具体来说,如果一个方法被标记了 @Transactional,并且在该方法中抛出了 RuntimeException 异常或其子类的异常,那么 Spring 会自动回滚该事务。当然,也可以通过设置 rollbackFor 属性,让 Spring 在出现特定的异常时回滚事务。
假设在一个银行转账的场景中,从一个账户向另一个账户转账,需要在代码中使用 @Transactional 注解来保证转账操作的原子性和一致性。如果转账过程中发生异常,比如接收方账户不存在或余额不足等,那么事务会自动回滚,转出方的账户余额不会被扣减,保证了数据的完整性。
在 Spring 的 @Transactional 注解中,属性 rollbackFor 可以用于指定当哪些异常发生时需要回滚事务。具体来说,如果在 @Transactional 注解中指定了 rollbackFor 属性,则当方法抛出指定类型的异常时,Spring 会自动回滚事务。
例如,假设我们有一个 UserService 接口,其中定义了一个 transferMoney() 方法用于转账操作,它使用了 @Transactional 注解:
javaCopy codepublicinterfaceUserService {
@Transactional(rollbackFor = {InsufficientBalanceException.class})voidtransferMoney(String fromUser, String toUser, double amount)throws InsufficientBalanceException;
}
在上面的例子中,我们使用 rollbackFor 属性指定了 InsufficientBalanceException 类型的异常,这表示当该异常抛出时,Spring 会回滚事务。如果转账过程中出现了余额不足的情况,该方法会抛出 InsufficientBalanceException 异常,从而触发事务回滚,保证转账操作的一致性和正确性。
3.PG 和 MySQL 的区别
PostgreSQL(简称PG)和MySQL是两个常见的开源关系型数据库管理系统(RDBMS),二者有以下几个方面的区别:
数据类型:PG支持更丰富的数据类型,如数组、JSON、XML、UUID等,而MySQL相对较少;
事务处理:PG支持更复杂的事务处理和更严格的ACID(原子性、一致性、隔离性、持久性)规则,MySQL则较为简单;
性能:在大数据量和高并发情况下,PG的性能相对较好,而MySQL在小数据量和低并发情况下表现更好;
复制:PG的复制机制更加灵活和可靠,可以进行异步和同步复制,支持多主复制等,而MySQL则较为简单。
需要注意的是,PG和MySQL都是优秀的数据库管理系统,选择使用哪一个取决于具体的应用场景和需求。
4.ArrayList 和LinkedList的区别
ArrayList 和 LinkedList 都是 Java 集合框架中常用的 List 实现类,它们之间的主要区别在于底层数据结构不同。
ArrayList 底层采用数组实现,内部维护一个 Object[] 数组用于存储元素,每次添加元素时,如果数组容量不足,则会进行扩容,需要重新分配一个更大的数组,并将原数组中的元素复制到新数组中。因为 ArrayList 是基于数组实现的,所以它支持随机访问,查找元素时时间复杂度为 O(1),但是插入和删除元素时,需要将插入位置后面的元素全部向后移动一位,时间复杂度为 O(n)。
LinkedList 底层采用双向链表实现,每个节点包含前驱节点、后继节点和数据三个部分。LinkedList 不支持随机访问,查找元素时需要从链表头或链表尾开始遍历,时间复杂度为 O(n),需要注意的是,有些文章里面说,LinkedList 插入元素的时间复杂度近似 O ( 1 ),其实是有问题的,因为 add(int index, E element) 方法在插入元素的时候会调用 node(index) 查找元素,该方法之前我们之间已经确认过了,时间复杂度为 O ( n ),即便随后调用 linkBefore() 方法进行插入的时间复杂度为 O ( 1 ),总体上的时间复杂度仍然为 O ( n ) 才对。
因此,如果需要经常进行随机访问操作,应该选择 ArrayList,如果需要经常进行插入和删除操作,应该选择 LinkedList。
5. 网关的作用
Spring Cloud 网关的作用是在微服务架构中作为一个入口,接收客户端请求并将请求路由到后端服务。它可以用来处理安全、流量控制、监控、负载均衡等问题。具体而言,Spring Cloud 网关可以实现以下功能:
路由:将请求路由到不同的后端服务。
过滤:在请求路由到后端服务之前,可以对请求进行过滤处理,比如请求验证、日志记录等。
监控:统计各个服务的请求次数、响应时间等指标,帮助管理员及时发现异常。
安全:对请求进行鉴权、加密等操作,确保系统安全性。
负载均衡:对请求进行负载均衡,避免单一服务负载过大。
综上所述,Spring Cloud 网关是微服务架构中非常重要的一个组件,可以为整个系统提供高效、安全、稳定的请求入口