2024-03-19 12:26:12
5.18招联金融后端面试可能涉及的问题及回答要点如下:
1. Spring Boot的启动流程核心步骤:
初始化SpringApplication实例:加载应用主类、配置类(如@SpringBootApplication标注的类),并推断应用类型(Web/非Web)。
准备环境:根据配置(如application.properties)初始化环境变量、Profile、资源加载器等。
创建应用上下文:根据应用类型选择对应的ApplicationContext(如AnnotationConfigServletWebServerApplicationContext)。
刷新上下文:执行核心逻辑,包括Bean定义扫描、依赖注入、自动配置(@EnableAutoConfiguration)、事件发布等。
启动内置服务器(仅Web应用):若使用嵌入式服务器(如Tomcat),会在此阶段初始化并启动。
关键点:
自动配置依赖spring-boot-autoconfigure模块,通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载配置类。
启动过程可通过SpringApplicationRunListener监听各阶段事件(如started、failed)。
核心注解:
@SpringBootApplication:组合注解,包含@Configuration、@EnableAutoConfiguration、@ComponentScan。
@RestController:@Controller + @ResponseBody,用于构建RESTful API。
@RequestMapping及其变体(如@GetMapping、@PostMapping):定义URL路径与HTTP方法映射。
@Autowired:自动注入Bean,默认按类型匹配。
@Service、@Repository、@Component:标记类为Spring管理的Bean。
@ConfigurationProperties:将配置文件属性绑定到Java对象。
扩展注解:
@EnableCaching:启用缓存抽象。
@Transactional:声明事务管理(见下文参数细节)。
@Transactional核心参数:
propagation:事务传播行为(如REQUIRED默认值,支持新事务;NESTED嵌套事务)。
isolation:事务隔离级别(如READ_COMMITTED避免脏读)。
timeout:事务超时时间(秒),超时后回滚。
readOnly:标记事务为只读,优化性能(如查询操作)。
rollbackFor/noRollbackFor:指定异常类型触发/不触发回滚(如rollbackFor = Exception.class)。
示例:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)public void updateData() { ... }单例模式:Spring中Bean默认单例(scope="singleton"),通过@Scope修改。
工厂模式:BeanFactory和ApplicationContext创建Bean实例。
代理模式:AOP实现动态代理(JDK动态代理或CGLIB)。
观察者模式:Spring事件监听(ApplicationEvent + ApplicationListener)。
模板方法模式:JdbcTemplate、RestTemplate封装固定流程,允许自定义扩展。
核心机制:
注解解析:Spring通过AnnotationUtils或AnnotatedElementUtils在运行时读取注解属性。
处理器链:BeanPostProcessor(如AutowiredAnnotationBeanPostProcessor处理@Autowired)在Bean初始化阶段介入。
AOP代理:@Transactional等注解通过AOP生成代理对象,在方法调用前后插入逻辑(如开启/提交事务)。
示例流程:
扫描类时发现@Transactional注解。
生成代理对象(JDK动态代理或CGLIB)。
方法调用时触发TransactionInterceptor,根据注解参数执行事务逻辑。
程序计数器:记录线程执行的字节码行号,唯一无OOM的区域。
虚拟机栈:存储方法调用的栈帧(局部变量表、操作数栈等),栈深度过大抛出StackOverflowError。
本地方法栈:类似虚拟机栈,服务于Native方法。
堆:存放对象实例,垃圾回收主要区域,分新生代(Eden、Survivor)和老年代。
方法区:存储类信息、常量、静态变量等(JDK 8后改为元空间,使用本地内存)。
运行时常量池:方法区的一部分,存放编译期生成的字面量与符号引用。
新生代(Young Generation):
算法:复制算法(Copying)。
分区:Eden区(大) + 两个Survivor区(From/To,较小)。
流程:对象优先分配在Eden,Minor GC后存活对象移至Survivor区,多次存活后晋升老年代。
老年代(Old Generation):
算法:标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)。
触发条件:老年代空间不足或Full GC。
优化:CMS(并发标记清除,减少停顿)和G1(面向大堆,分区回收)。
短期规划:
巩固后端核心技能(Spring生态、分布式系统、数据库优化)。
学习云原生技术(Docker、Kubernetes)和微服务架构(Spring Cloud Alibaba)。
长期规划:
深耕高并发、高可用领域,积累架构设计经验。
关注行业趋势(如AI工程化、Serverless),拓展技术视野。
学习建议:
实践项目驱动:参与开源或内部项目,解决实际问题。
持续输出:通过技术博客或分享会沉淀知识。