【Spring 面试突击 · 03】大厂高频面试题:从IoC容器底层原理到Spring Boot自动配置解析
目录一、Spring Boot如何启动Tomcat二、Spring Boot配置文件加载顺序三、MyBatis的优缺点四、Hibernate与MyBatis的区别五、Spring Context模块的理解六、什么是Spring依赖注入七、什么是Spring Bean八、Spring AOP与AspectJ AOP的区别AOP的实现方式九、Spring通知的类型十、Spring AOP中关注点与横切关注点的区别一、Spring Boot如何启动TomcatSpring Boot通过嵌入式Servlet容器实现Tomcat的自动启动核心流程如下依赖触发引入spring-boot-starter-web时会自动包含spring-boot-starter-tomcat嵌入式Tomcat依赖。自动配置Spring Boot的EmbeddedServletContainerAutoConfiguration类会检测类路径下的Servlet容器依赖如Tomcat并自动配置嵌入式容器。容器初始化通过TomcatServletWebServerFactory创建Tomcat实例设置端口、线程池等参数默认端口8080可通过server.port修改。启动流程Spring应用上下文刷新完成后调用WebServer的start()方法启动Tomcat服务器监听HTTP请求。关键点Spring Boot的“零配置”特性通过自动配置类和条件注解如ConditionalOnClass实现避免了传统Spring中繁琐的web.xml配置。二、Spring Boot配置文件加载顺序Spring Boot配置文件的加载顺序遵循“后加载的覆盖先加载的”原则优先级从高到低如下命令行参数通过--keyvalue传递的参数如java -jar app.jar --server.port9090。环境变量系统环境变量如SERVER_PORT9090。JVM系统属性通过-Dkeyvalue设置的参数如-Dserver.port9090。application-{profile}.properties激活的Profile配置文件如application-dev.properties。application.properties默认配置文件位于src/main/resources或类路径根目录。jar包外的配置文件与jar包同级目录下的config文件夹中的配置文件。jar包内的配置文件src/main/resources/config目录下的配置文件。注意若多个配置文件存在相同key优先级高的配置会覆盖优先级低的配置例如命令行参数会覆盖application.properties中的配置。三、MyBatis的优缺点优点学习成本低基于原生SQL开发开发者只需编写SQL语句和映射规则无需学习复杂的ORM映射规则。SQL灵活可控支持动态SQL如if、foreach标签可根据业务逻辑动态生成SQL适合复杂查询场景。轻量级与Spring等框架集成简单无额外依赖启动速度快。缓存机制支持一级缓存SqlSession级别和二级缓存Mapper级别可提升查询性能。缺点SQL维护成本高SQL语句分散在XML或注解中当表结构变更时需手动修改所有相关SQL易遗漏。数据库移植性差原生SQL通常依赖特定数据库语法如MySQL的LIMIT、Oracle的ROWNUM切换数据库时需重写SQL。对象映射繁琐需手动配置ResultMap实现数据库字段与Java对象的映射复杂场景下配置量大。四、Hibernate与MyBatis的区别对比维度HibernateMyBatisORM模式全自动ORM框架通过HQLHibernate Query Language操作数据库无需编写SQL。半自动ORM框架需手动编写SQL通过XML或注解映射数据库字段与Java对象。学习成本学习曲线陡峭需掌握HQL、缓存机制、事务管理等复杂概念。学习成本低基于原生SQL开发开发者可快速上手。SQL灵活性SQL由框架自动生成灵活性差难以优化复杂查询。SQL完全由开发者控制支持动态SQL适合复杂业务场景。数据库移植性通过HQL屏蔽数据库差异切换数据库时只需修改方言配置无需修改代码。SQL依赖特定数据库语法切换数据库时需重写SQL。适用场景快速开发、表结构稳定的项目如CRUD为主的管理系统。复杂查询、高性能要求的项目如电商、金融系统。五、Spring Context模块的理解Spring Context模块是Spring框架的核心容器基于BeanFactory构建提供了更高级的容器功能应用上下文ApplicationContext扩展了BeanFactory支持自动装配、国际化、事件发布、资源加载等功能是Spring应用的核心接口。Bean生命周期管理负责Bean的创建、初始化、依赖注入、销毁等全生命周期管理支持通过PostConstruct、PreDestroy注解自定义生命周期回调。AOP支持通过ApplicationContext自动注册AOP代理实现面向切面编程如事务管理、日志记录。事件驱动模型支持发布-订阅模式开发者可通过ApplicationEvent和ApplicationListener实现事件监听。核心作用Spring Context模块将Bean的管理从“工厂模式”升级为“容器模式”通过依赖注入和面向切面编程降低了组件间的耦合度提升了应用的可扩展性。六、什么是Spring依赖注入依赖注入Dependency Injection, DI是Spring框架实现控制反转Inversion of Control, IoC的核心机制其本质是将对象的依赖关系由容器动态注入而非由对象自行创建。依赖注入的三种方式构造器注入通过构造方法注入依赖对象适用于强制依赖如Service层依赖DAO层。Component public class UserService { private final UserDao userDao; Autowired public UserService(UserDao userDao) { this.userDao userDao; } }Setter注入通过Setter方法注入依赖对象适用于可选依赖如配置类的属性注入。Component public class UserService { private UserDao userDao; Autowired public void setUserDao(UserDao userDao) { this.userDao userDao; } }字段注入通过Autowired注解直接注入依赖对象代码简洁但不推荐破坏了类的封装性不利于单元测试。Component public class UserService { Autowired private UserDao userDao; }优点依赖注入通过解耦组件间的依赖关系使代码更易测试、维护和扩展是Spring框架实现“高内聚、低耦合”的核心手段。七、什么是Spring BeanSpring Bean是Spring框架管理的Java对象由Spring IoC容器负责创建、配置和管理。Bean的定义包含以下核心信息类信息Bean对应的Java类如UserService.class。作用域Bean的生命周期范围支持singleton单例默认、prototype原型、request、session等。依赖关系Bean的依赖对象通过依赖注入实现。生命周期回调Bean的初始化方法如PostConstruct和销毁方法如PreDestroy。Bean的创建方式注解驱动通过Component、Service、Repository等注解标记类Spring会自动扫描并注册为Bean。XML配置在applicationContext.xml中通过bean标签定义Bean。Java配置通过Configuration和Bean注解在Java类中定义Bean。核心作用Spring Bean是Spring框架实现控制反转和依赖注入的基础通过容器管理Bean的生命周期和依赖关系降低了组件间的耦合度。八、Spring AOP与AspectJ AOP的区别AOP的实现方式Spring AOP与AspectJ AOP的区别对比维度Spring AOPAspectJ AOP织入时机运行时织入通过动态代理实现性能稍低。编译时织入通过AspectJ编译器或类加载时织入性能更高。功能范围仅支持方法级别的连接点如方法执行前后。支持字段访问、构造器调用、异常处理等更广泛的连接点。依赖关系依赖Spring框架需与Spring容器集成。独立于Spring框架可单独使用。配置方式支持注解如Aspect和XML配置与Spring生态无缝集成。支持注解和AspectJ特有的语法如pointcut配置更灵活。AOP的实现方式JDK动态代理基于Java反射机制为目标对象的接口生成代理类适用于实现了接口的Bean。CGLIB代理基于ASM字节码操作框架为目标类生成子类代理适用于未实现接口的Bean。AspectJ织入通过AspectJ编译器或类加载器在编译时或类加载时将切面逻辑织入目标类性能最优。九、Spring通知的类型Spring AOP的通知Advice定义了切面在连接点的执行时机共有5种类型前置通知Before在目标方法执行前执行通过Before注解定义。Before(execution(* com.example.service.*.*(..))) public void beforeMethod() { System.out.println(前置通知方法执行前); }后置通知After在目标方法执行后执行无论方法是否抛出异常通过After注解定义。返回通知AfterReturning在目标方法正常返回后执行可通过returning属性获取返回值通过AfterReturning注解定义。AfterReturning(pointcut execution(* com.example.service.*.*(..)), returning result) public void afterReturning(Object result) { System.out.println(返回通知方法返回值为 result); }异常通知AfterThrowing在目标方法抛出异常后执行可通过throwing属性获取异常信息通过AfterThrowing注解定义。环绕通知Around在目标方法执行前后都执行可通过ProceedingJoinPoint控制目标方法的执行是最强大的通知类型通过Around注解定义。Around(execution(* com.example.service.*.*(..))) public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println(环绕通知方法执行前); Object result joinPoint.proceed(); // 执行目标方法 System.out.println(环绕通知方法执行后); return result; }十、Spring AOP中关注点与横切关注点的区别关注点Concern指应用中需要实现的核心业务逻辑如用户注册、订单支付是应用的主要功能模块。横切关注点Cross-cutting Concern指贯穿多个业务模块的通用功能如日志记录、事务管理、安全控制这些功能与核心业务逻辑无关但又需要在多个模块中重复实现。区别范围不同关注点是业务功能如“用户注册”横切关注点是通用功能如“日志记录”。耦合度不同关注点通常与业务模块高度耦合横切关注点通过AOP技术与业务模块解耦实现“模块化”管理。实现方式不同关注点通过业务类实现横切关注点通过切面Aspect实现避免了代码重复和耦合。示例在电商系统中“下单”是关注点核心业务而“事务管理”是横切关注点贯穿下单、支付、库存等多个模块通过AOP将事务管理与业务逻辑解耦提升了代码的可维护性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2460358.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!