sping面试
本文最后更新于 2025-05-10,文章内容可能已经过时。
Spring Bean一共有几种作用域?
@Qualifier注解有什么作用
@Bean和@Component有什么区别?
@Component、@Controller、@Repository和@Service 的区别?
Spring中的@Primary注解的作用是什么?
Spring中的@Value注解的作用是什么?
Spring中的@ModelAttribute注解的作用是什么?
在Spring中,拦截器和过滤器有什么区别?
什么是循环依赖(常问)?
Spring如何解决循环依赖?
为什么Spring循环依赖需要三级缓存,二级不够吗?
看过源码吗?说下Spring由哪些重要的模块组成?
什么是 Spring IOC?2
Spring lOC 有什么好处?
Spring 中的 DI 是什么?
什么是 Spring Bean?
Spring 中的 BeanFactory 是什么?
Spring 中的 FactoryBean 是什么?
Spring 中的 ObjectFactory 是什么?
Spring 中的 ApplicationContext 是什么?
Spring一共有几种注入方式?
什么是 AOP?
SpringAOP默认用的是什么动态代理,两者的区别?
能说说 Spring拦截链的实现吗?
Spring AOP 和 AspectJ 有什么区别?
说下 Spring Bean 的生命周期?
说下对 Spring MVC 的理解?
Spring MVC 具体的工作原理?
SpringMVC父子容器是什么知道吗?
你了解的 Spring都用到哪些设计模式?
Spring事务有几个隔离级别?
Spring有哪几种事务传播行为?
Spring事务传播行为有什么用?
Spring 的优点
Spring AOP相关术语都有哪些?
Spring 通知有哪些类型?
Spring lOC 容器初始化过程?
Spring Bean注册到容器有哪些方式?
Spring自动装配的方式有哪些?
Spring事务在什么情况下会失效?
Spring事务失效的常见场景及解决:
非
public方法原因:Spring默认只代理
public方法。解决:方法改为
public,或用AspectJ模式。自调用(同类方法调用)
原因:内部调用不走代理,事务不生效。
解决:拆分到其他Bean,或通过代理对象调用。
异常未抛出或类型不符
原因:默认只回滚
RuntimeException,捕获异常未抛出。解决:配置
@Transactional(rollbackFor=Exception.class),或在catch中手动回滚。数据库引擎不支持
原因:如MyISAM引擎。
解决:切换为InnoDB等支持事务的引擎。
传播行为配置错误
原因:如用
SUPPORTS但无事务上下文。解决:根据场景选
REQUIRED等合适传播行为。多数据源未指定管理器
原因:未显式指定事务管理器名。
解决:注解中加
@Transactional("managerName")。未启用事务管理
原因:缺少
@EnableTransactionManagement。解决:主配置类添加该注解。
静态/私有方法使用事务
原因:AOP无法代理私有或静态方法。
解决:仅用于公有实例方法。
一句话总结:确保方法公开、异常抛出、引擎支持、传播合理,避免自调用,检查配置和代理。
说说 Spring 启动过程?
Spring的单例Bean是否有并发安全问题?
Spring中的@Profile注解的作用是什么?
Spring中的@PostConstruct和@PreDestroy注解的作用是什么?
Spring中的@RequestBody和@ResponseBody注解的作用是什么?
Spring中的@PathVariable注解的作用是什么?
Spring中的@ExceptionHandler注解的作用是什么?
Spring中的@ResponseStatus注解的作用是什么?
Spring中的@RequestHeader和@CookieValue注解的作用是什么?
Spring中的@SessionAttribute注解的作用是什么?
Spring 中的@Validated 和@Valid 注解有什么区别?
Spring 中的@Scheduled 注解的作用是什么?
Spring中的@Cacheable和@CacheEvict 注解的作用是什么?
Spring中的@Conditional注解的作用是什么?
Spring 中的@Lazy注解的作用是什么?
Spring 中的@PropertySource 注解的作用是什么?
Spring中的@EventListener注解的作用是什么?
@Async 注解的原理是什么?
Spring 和 Spring MVC 的关系是什么?
Spring WebFlux 是什么?它与 Spring MVC 有何不同?
介绍下 Spring MVC 的核心组件?
什么是Restful 风格的接口?
Spring MVC中的Controller是什么?如何定义一个Controller?
SpringMVC中如何处理表单提交?
SpringMVC中的视图解析器有什么作用?
SpringMVC中的拦截器是什么?如何定义一个拦截器?
SpringMVC中的国际化支持是如何实现的?
Spring MVC中如何处理异常?
Spring 中的 JPA 和 Hibernate 有什么区别?
@Async如何避免内部调用失效?
@Async什么时候会失效?
Spring中@Async注解失效的常见场景及解决方案如下:
1. 自调用(同类内部调用)
- 原因:在同一个类中,方法A调用被
@Async标注的方法B时,由于Spring的动态代理机制仅作用于外部调用,内部调用会绕过代理,导致异步失效。 - 解决:
- 将异步方法拆分到另一个Bean中,通过依赖注入调用。
- 使用
AopContext.currentProxy()获取代理对象调用(需在配置类添加@EnableAspectJAutoProxy(exposeProxy = true))。
2. 未启用异步支持
- 原因:未在配置类添加
@EnableAsync注解,导致异步处理未被激活。 - 解决:在任意配置类上添加
@EnableAsync以启用异步支持。
3. 非public方法
- 原因:
@Async基于AOP代理实现,只有public方法才能被代理拦截。 - 解决:确保异步方法为
public,避免使用protected或private修饰符。
4. 线程池配置错误
- 原因:未自定义线程池或配置不合理(如线程数过少、队列容量不足),导致任务无法提交或阻塞。
- 解决:
- 实现
AsyncConfigurer接口自定义线程池参数。 - 通过
@Async("customExecutor")指定自定义线程池。
5. 异常处理不当
- 原因:异步方法抛出异常时,若未通过
Future捕获或未在方法内处理,调用者无法感知异常,任务可能静默失败。 - 解决:
- 返回
Future类型并通过get()方法捕获异常。 - 在异步方法内使用
try-catch处理异常。
6. 静态方法或非Spring管理的Bean
- 原因:
@Async无法作用于static方法(代理机制不生效)。- 异步方法所在的类未被Spring管理(如未标注
@Service)。 - 解决:
- 确保异步方法为实例方法且所在类被Spring容器管理。
7. 返回类型不兼容
- 原因:
@Async方法仅支持void或Future/CompletableFuture返回类型,其他类型会导致异步失效。 - 解决:调整返回类型为
void或Future。
8. 与事务注解@Transactional冲突
- 原因:
@Transactional和@Async同时作用于同一方法时,事务可能因代理顺序问题失效。 - 解决:
- 将事务操作与异步调用拆分到不同方法中。
- 自定义事务管理器并调整传播行为。
9. 直接通过new创建对象调用
- 原因:通过
new关键字实例化的对象未经过Spring代理,导致@Async失效。 - 解决:始终通过依赖注入获取Bean实例。
排查建议
- 日志检查:开启Spring Debug日志(
logging.level.org.springframework.scheduling=DEBUG)观察异步任务提交记录。 - 代理验证:注入Bean后检查是否为代理对象(类名包含
$$EnhancerBySpringCGLIB$$)。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 粥粥
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果