Spring生态

一、Spring Boot

1. 核心注解

  • @Component: 标记一个类为 Spring 容器管理的组件,通用的注解。
  • @Service: 标记一个类为服务层组件,通常用于业务逻辑层。
  • @Repository: 标记一个类为数据访问层组件,通常用于 DAO 层。
  • @Controller: 标记一个类为控制器组件,通常用于 MVC 模式中的控制器。
  • @RestController: 结合了 @Controller 和 @ResponseBody,用于 RESTful Web 服务。

2. 依赖注入

  • @Autowired: 自动注入依赖,可以用于字段、构造器或方法。
  • @Qualifier: 与 @Autowired 一起使用,指定要注入的 bean 的名称。
  • @Resource: 类似于 @Autowired,但按名称注入。
  • @Value: 注入属性值,通常用于从配置文件中读取值。

3. 配置

  • @Configuration: 标记一个类为配置类,通常与 @Bean 一起使用。
  • @Bean: 标记一个方法返回的对象为 Spring 容器管理的 bean。
  • @ComponentScan: 指定 Spring 扫描组件的包路径。
  • @PropertySource: 指定属性文件的位置,用于加载配置。

4. AOP(面向切面编程)

  • @Aspect: 标记一个类为切面类。
  • @Before: 在目标方法执行前执行。
  • @After: 在目标方法执行后执行,无论是否抛出异常。
  • @AfterReturning: 在目标方法成功返回后执行。
  • @AfterThrowing: 在目标方法抛出异常后执行。
  • @Around: 环绕通知,可以在目标方法执行前后执行自定义逻辑。

5. 事务管理

  • @Transactional: 标记一个方法或类为事务性的,用于声明式事务管理。

二、Mybatis

1. 什么是MyBatis?

MyBatis是一个基于Java的持久层框架,它封装了JDBC操作,简化了数据库访问。MyBatis通过XML或注解将Java对象与SQL语句进行映射,开发者可以直接编写SQL语句,灵活地控制查询逻辑。

2. MyBatis的核心组件有哪些?

  • SqlSessionFactory:用于创建SqlSession的工厂类,是MyBatis的核心对象。
  • SqlSession:表示一次数据库会话,用于执行SQL语句、获取Mapper接口。
  • Mapper接口:定义了数据库操作的方法,MyBatis通过动态代理实现接口。
  • Mapper XML文件:定义了SQL语句和结果映射规则。
  • Configuration:包含了MyBatis的全局配置信息。

3. MyBatis中#{}和${}的区别是什么?

  • #{}:
    • 是预编译占位符,MyBatis会将#{}替换为?,并通过PreparedStatement设置参数,防止SQL注入。
    • 适用于传递参数值。
  • ${}:
    • 是字符串替换,MyBatis会直接将${}替换为变量的值,存在SQL注入风险。
    • 适用于动态表名、列名等场景。

4. MyBatis如何实现分页?

  • 逻辑分页:使用MyBatis的RowBounds对象,在内存中进行分页,适合数据量小的场景。
  • 物理分页:在SQL语句中使用LIMIT和OFFSET(MySQL)或ROWNUM(Oracle)实现分页。
  • 分页插件:使用PageHelper等分页插件,简化分页操作。

5. MyBatis的一级缓存和二级缓存有什么区别?

  • 一级缓存:
    • 默认开启,作用域为SqlSession级别。
    • 在同一个SqlSession中,相同的查询会直接从缓存中获取结果。
    • 当SqlSession关闭或执行增删改操作时,缓存会被清空。
  • 二级缓存:
    • 需要手动开启,作用域为Mapper级别(跨SqlSession)。
    • 多个SqlSession可以共享二级缓存。
    • 适合读取频繁、更新较少的场景。

6. MyBatis如何实现多表关联查询?

  • 嵌套查询:在主查询中通过< association >或< collection >标签嵌套子查询。
  • 嵌套结果:通过JOIN查询一次性获取所有数据,然后在结果映射中使用< association >或< collection >标签映射关联对象。

7. MyBatis的动态SQL有哪些标签?

  • < if >: 条件判断。
  • < choose >、< when >、< otherwise >: 多条件选择。
  • < where >: 动态生成WHERE子句。
  • < set >: 动态生成SET子句。
  • < foreach >: 遍历集合,生成IN语句或批量操作。
  • < trim >: 去除多余的字符(如AND、OR)。

8. MyBatis如何实现批量插入?

  • 使用< foreach >标签遍历集合,生成多条INSERT语句。
  • 使用SqlSession的batch方法实现批量操作。

9. MyBatis如何解决SQL注入问题?

  • 使用#{}预编译占位符,避免直接拼接SQL。
  • 避免使用${}进行字符串替换,除非是动态表名、列名等场景。
  • 对用户输入进行严格的校验和过滤。

三、Spring Cloud

1. 服务注册与发现

  • @EnableEurekaClient: 启用 Eureka 客户端,将服务注册到 Eureka 服务器。
  • @EnableDiscoveryClient: 启用服务发现客户端,适用于多种服务发现工具(如 Eureka、Consul、Zookeeper)。
  • @LoadBalanced: 标记 RestTemplate 或 WebClient,使其具备负载均衡能力。

2. 配置管理

  • @EnableConfigServer: 启用配置服务器,集中管理微服务的配置。
  • @RefreshScope: 标记 Bean,使其在配置更改时能够动态刷新。

3. API 网关

  • @EnableZuulProxy: 启用 Zuul 代理,用于 API 网关路由和过滤。
  • @EnableZuulServer: 启用 Zuul 服务器,提供基本的网关功能。
  • @EnableGateway: 启用 Spring Cloud Gateway,提供更强大的 API 网关功能。

4. 熔断器与限流

  • @EnableHystrix: 启用 Hystrix 熔断器,提供容错和延迟容忍能力。
  • @HystrixCommand: 标记方法,使其具备熔断器功能。
  • @EnableCircuitBreaker: 启用熔断器功能,适用于多种熔断器实现(如 Hystrix、Resilience4j)。
  • @SentinelResource: 标记方法,使其具备 Sentinel 的限流和熔断功能。

5. 分布式追踪

  • @EnableSleuth: 启用 Sleuth,提供分布式追踪功能。
  • @NewSpan: 标记方法,使其在追踪中创建一个新的 Span。

6. 消息驱动

  • @EnableBinding: 启用消息绑定,将应用程序与消息中间件(如 Kafka、RabbitMQ)连接。
  • @StreamListener: 标记方法,使其监听消息通道中的消息。

四、Spring Security

1.@EnableWebSecurity

  • 启用 Spring Security 的 Web 安全支持。
  • 通常用于配置类上,表示该类是 Spring Security 的配置类。

2.@PreAuthorize

  • 在方法执行前进行权限检查。
  • 支持 SpEL(Spring Expression Language)表达式。

3.@Secured

  • 用于指定方法所需的角色。
  • 不支持 SpEL,仅支持简单的角色名称。

4.@WithAnonymousUser

  • 用于测试,模拟匿名用户。

Spring生态
http://example.com/2025/02/17/Spring生态/
作者
yunwx
发布于
2025年2月17日
许可协议