【八股学习】Spring & SpringBoot常见面试题

Spring

Spring IOC

将类声明为Bean的注解

@Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
@Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

@Component 和 @Bean 的区别是什么?⭐
  • @Component 注解作用于类,而@Bean注解作用于方法。
  • @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。
  • @Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。
  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现
@Autowired 和 @Resource 的区别是什么?⭐

Autowired 属于 Spring 内置的注解,默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。

如果一个接口存在多个实现类,那么就无法正确地注入对象了,这时就是通过byName(找符合名字的接口实现类)来注入

// 假设有SmsServiceImpl1和 SmsServiceImpl2两个实现类,且被容器管理
// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入  SmsServiceImpl1 对象对应的 bean ⭐推荐
// smsServiceImpl1 就是我们上面所说的名称 
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

Resource为JDK提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType。

@Resource 有两个比较重要且日常开发常用的属性:name(名称)、type(类型),可以通过指定不同的属性达到不同的注入方式。

// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式⭐)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

@Autowired 支持在构造函数、方法、字段和参数上使用。@Resource 主要用于字段和方法上的注入,不支持在构造函数或参数上使用

注入 Bean 的方式有哪些?

依赖注入的常见方法如下:

  1. 构造函数注入:通过类的构造函数来注入依赖项。(推荐⭐,用final修饰防止变更,并且保证对象实例化时拥有所有依赖)
  2. Setter 注入:通过类的 Setter 方法来注入依赖项。
  3. Field(字段) 注入:直接在类的字段上使用注解(如 @Autowired 或 @Resource)来注入依赖项。

构造函数注入还是 Setter 注入?

依赖完整性:确保所有必需依赖在对象创建时就被注入,避免了空指针异常的风险。
不可变性:有助于创建不可变对象,提高了线程安全性。
初始化保证:组件在使用前已完全初始化,减少了潜在的错误。
测试便利性:在单元测试中,可以直接通过构造函数传入模拟的依赖项,而不必依赖 Spring 容器进行注入。

构造函数注入适合处理必需的依赖项,而 Setter 注入 则更适合可选的依赖项,这些依赖项可以有默认值或在对象生命周期中动态设置。

Bean 的作用域有哪些?

主要介绍常用的两种:
singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
   
    return new 
### 关于Spring Boot 3的常见面试问及解答 #### Spring Boot 3的主要新特性是什么? Spring Boot 3引入了许多重要的改进和更新,旨在提高性能、安全性和易用性。主要的新特性包括对Jakarta EE的支持以及对Spring Framework 6的支持,这使得开发者能够利用最新的Java标准库和技术栈[^2]。 #### 如何理解Spring Boot中的自动配置机制? Spring Boot通过提供默认配置和自动化配置简化了Spring应用程序的开发过程。当启动一个基于Spring Boot的应用程序时,它会根据classpath上的类和其他条件自动应用一系列预定义的设置。这种机制减少了大量的样板代码编写工作量,并加快了项目的初始化速度[^3]。 #### 在Spring Boot中怎样处理全局异? 为了有效地管理错误情况并返回一致性的响应给客户端,在Spring Boot中有几种方式可以用来捕获和处理未预期到的情况。一种常见的做法是创建自定义的`@ControllerAdvice`组件来集中管理和映射不同类型的异事件至相应的HTTP状态码或JSON消息体。此外还可以使用`@ExceptionHandler`注解指定特定方法用于捕捉某些具体的异类型。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<?> resourceNotFoundHandling(ResourceNotFoundException ex){ ErrorDetails errorDetails = new ErrorDetails(new Date(), "Resource Not Found", ex.getMessage()); return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND); } } ``` #### 解释下微服务架构下的断路器模式及其在Spring Cloud中的实现——Hystrix的作用? 断路器是一种设计模式,其目的是防止系统因部分失败而导致整体崩溃。在一个分布式环境中,如果某个远程调用超出了合理的时间范围,则应该立即中断该请求而不是让整个事务等待更长时间。Hystrix作为Netflix开源工具集的一部分被广泛应用于实施这一策略;它可以监控依赖项之间的交互频率及时延数据,并据此决定何时开启熔断逻辑以保护下游资源免受连锁反应的影响[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值