Spring & SpringBoot面试常问题

7 阅读5分钟

1.Spring 是什么?核心特性?

Spring是一个轻量级Java开发框架,用来简化企业级开发,管理对象、整合其他技术

两大核心特征

  1. IOC控制反转
  • 把对象的创建、依赖注入交给Spring管理
  • 不用自己new对象,解耦、方便维护
  1. AOP面向切面编程
  • 把日志、事务、权限等通用功能抽成切面
  • 不修改业务代码就能统一增强,实现解耦
  1. 其他常用特征
  • DI依赖注入:IOC的具体实现方式
  • 声明式事务:用注解@Transactional管理事务
  • 整合MyBatis、SpringMVC、SpringBoot、Redis等几乎所有主流框架
  • 支持面向接口编程,方便测试、扩展

总结

Spring是java一站式开发框架,核心是IOC管理对象、AOP统一增强,简化开发、解耦、方便整合各种技术。

2.IOC 是什么?DI 是什么?

1.IOC(Inversion of Control)控制反转

把对象的创建和管理权,从程序员反转给Spring容器

  • 以前:自己new UserService()、自己管理依赖
  • 现在:Spring帮你new、帮你管理对象生命周期
  • 目的:解耦,不用硬编码依赖关系

IOC是一种思想/设计模式,不是具体技术

2.DI(Dependcecy Injection)依赖注入

Spring自动把需要的对象赋值给成员变量,不用自己set。

比如:

@Service
public class UserService {
@Autowired 
private UserDao userDao; // Spring 自动注入进来 
}
  • DI是IOC的具体实现方法
  • 注入方式:
    • 构造器注入(推荐)
    • setter注入
    • 字段注入(@AutoWired)

总结

  • IOC是思想:控制权反转,由Spring管理对象
  • DI是手段:通过注入自动负之依赖
  • 关系:IOC是目标,DI是实现IOC的方法

3.AOP 是什么?应用场景?

AOP:面向切面编程,在不修改原有业务代码的前提下,对方法进行统一增强。

核心思想:把日志、事务、权限、统计等通用逻辑抽离出来,形成一个切面(Aspect),动态切入到目标方法的前后或异常位置。

常用术语:

  • 切面(Aspect):要增强的功能(日志、事务)
  • 切点(Pointcut):哪些方法需要被增强
  • 通知(Advice):什么时候增强(前、后、异常、环绕)

AOP典型应用场景

1.声明式事务

@Transactional底层就是AOP,自动开启、提交、回滚事务。

2.统一日志记录

记录方法入参、出参、执行时间

3.权限控制

方法执行前校验是否登录、是否有权限

4.接口限流/防重复提交

方法执行前做拦截控制。

总结

AOP面向切面编程,用户横向抽取通用逻辑,不改动业务代码实现统一增强;最常用在事务、日志、权限、限流、监控。

4.Bean 的作用域

  1. singleton(单例,默认)
  • 整个容器只能创建一个Bean实例
  • 全局共享,每次获取都是同一个对象
  • 适合无状态Bean:Service、Dao、Controller
  1. prototype(原型)
  • 每次获取(@Autowired/getBean)都创建新对象
  • 多例,不共享
  • 适合有状态、线程不安全的Bean
  1. request(Web环境)
  • 每次HTTP请求创建一个Bean
  • 请求结束销毁
  1. session(Web环境)
  • 每个用户会话(Session)创建一个Bean
  1. application(Web环境)
  • 整个Web应用(ServiceContext)一个实例

总结

  1. singleton:单例,默认,全局一个
  2. prototype:多例,每次获取都新建
  3. request、session、application(仅Web环境)

5.Spring Boot 自动配置原理(简单说就行)

  1. 启动类上的 @SpringBootApplication,里面包含 @EnableAutoConfiguration
  2. 它会去读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 里的自动配置类
  3. 根据 @Conditional 条件注解(比如有没有对应类、有没有 Bean)判断是否需要装配
  4. 满足条件就自动创建 Bean,完成配置,不用手动写 XML 或大量配置类

一句话总结:按条件自动加载配置类,帮你自动创建 Bean,省去手动配置。

6.@SpringBootApplication 里面有什么

@SpringBootApplication本质是三个注解的合体

@SpringBootApplication 
= @Configuration 
+ @ComponentScan 
+ @EnableAutoConfiguration

分别干什么

1.@Configuration

声明当前类式配置类,Spring会扫描他

2.@ComponentScan

自动扫描当前包及子包下的@Controller、@Service、@Component等,创建Bean。

3.@EnableAutoConfiguration

开启自动配置,根据依赖自动配装需要的Bean(如MVC、数据源、Redis等)

总结

@SpringBootApplication=配置类+包扫描+自动配置,一键启动SpringBoot

7.@Controller、@RestController、@Service、@Repository 区别

  1. @Controller
  • 标识控制器层
  • 返回页面(视图),或北河@ResponseBody返回JSON
  • 用于传统MVC、前后不分离项目
  1. @RestController
  • =@Controller+@ResponseBody
  • 标识REST接口控制器
  • 所有方法默认返回JSON,不返回页面
  • 前后端分离项目专用
  1. @Service
  • 标识业务逻辑层(Service)
  • 处理业务、事务、逻辑判断
  1. @Repository
  • 标识数据访问层(Dao/Mapper)
  • 操作数据库
  • 会把数据库异常转为Spring的DataAccessException

总结

  • 页面/接口控制:@Controller
  • 接口只返回JSON:@RestController
  • 业务逻辑:@Service
  • 数据库操作:@Repository

8.@Autowired 和 @Resource 区别

  1. 来源不同
  • @Autowired:Spring自带
  • @Resource:Java官方(JSR-250)
  1. 默认注入方式不同
  • @Autowired:按类型(byType)注入,类型多个时再按名字匹配
  • @Resource:按名字(byName)优先,名字找不奥再按类型
  1. 是否必须注入
  • @Autowired可以用required-false表示非必须
  • @Resource没有这个属性
  1. 配合名字使用
  • @Autowired + @Qualifier("beanName")指定名字
  • @Resource(name="beanName")直接指定名字

总结

@Autowired先按类型,@Resource先按名字;前者Spring专属,后者Java标准。