Java 面试篇之SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)

      1.0 Spring 框架中的单例 bean 是线程安全的吗?

        不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。Spring 框架本身并不对单例 bean 进行线程安全封装,线程安全和并发问题需要开发者自行处理。

        通常项目中使用 Spring bean 是不可变状态(如 Service 类和 DAO 类),因此在某种程度上可以说 Spring 的单例 bean 是线程安全的,如果 bean 有多种状态(如 ViewModel 对象),就需要自行保证线程安全。最简单的解决办法是将单例 bean 的作用域由 "singleton" 变更为 "prototype" 。

        2.0 什么是 AOP?

        AOP,即面向切面编程,在 Spring 中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。

        3.0 项目中有没有使用到 AOP?

        在后台管理系统中使用 AOP 来记录系统操作日志。主要思路是使用 AOP 的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库中。

        4.0 Spring 中的事务是如何实现的?

        Spring 实现事务的本质是利用 AOP 完成的。它对方法前后进行拦截,在执行方法前开启事务,在执行完目标方法后,根据执行情况提交或回滚事务。

        5.0 Spring 中事务失效的场景有哪些?

        在项目中,遇到过几种导致事务失效的场景:

        1)如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。

        2)如果方法抛出检查异常(checked exception),并且没有在 @Transaction 注解上配置 rollbackFor 属性为 Exception,那么异常发生时事务可能不会回滚。

        3)如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。

        6.0 Spring 的 bean 的生命周期?

        Spring 中 bean 的生命周期包括以下步骤:

        1)通过 BeanDefinition 获取 bean 的定义信息。

        2)调用构造函数实例话 bean。

        3)进行 bean 的依赖注入,例如通过 setter 方法或 @Autowired 注解。

        4)处理实现了 Aware 接口的 bean。

        5)执行 BeanPostPricessor 的前置处理器。

        6)调用初始化方法,如实现了 InitializingBean 接口或自定义的 init-method。

        7)执行 BeanPostProcessor 的后置处理器,可能在这里产生代理对象。

        8)最后时销毁 bean。

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

        7.0 Spring 中循环引用?

        循环依赖发生在两个或两个以上的 bean 互相持有对方,形成闭环。Spring 框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题:

        1)一级缓存:单例池,缓存已完成初始化的 bean 对象。

        2)二级缓存:缓存尚未完成生命周期的早期 bean 对象。

        3)三级缓存:缓存 objectFactory,用于创建 bean 对象。

        8.0 具体解决循环依赖问题的流程清楚吗?

        解决循环依赖的流程如下:

        1)实例化 A 对象,并创建 ObjectFactory 存入三级缓存。

        2)A 在初始化时需要 B 对象,开始 B 的创建逻辑。

        3)B 实例化完成,也创建 ObjectFactory 存入三级缓存。

        4)B 需要注入 A,通过三级缓存获取 ObjectFactory 生成 A 对象,存入二级缓存。

        5)B 通过二级缓存获取 A 对象后,B 创建成功,存入一级缓存。

        6)A 对象初始化时,由于 B 已经创建完成,可以直接注入 B,A 创建成功存入一级缓存。

        7)清除二级缓存中的临时对象 A。

Java 面试篇之SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)_第1张图片

        9.0 构造方法出现了循环依赖怎么解决?

        由于构造函数时 bean 生命周期中最先执行的,Spring 框架无法解决构造方法的循环依赖问题。可以使用 @Lazy 懒加载注解,延迟 bean 的创建直到实际需要时。

        10.0 SpringMVC 的执行流程?

SpringMVC的执行流程包括以下步骤:
        1)用户发送请求到前端控制器DispatcherServlet。
        2)DispatcherServlet调用HandlerMapping找到具体处理器。
        3)HandlerMapping返回处理器对象及拦截器(如果有)给DispatcherServlet。
        4)DispatcherServlet调用HandlerAdapter。
        5)HandlerAdapter适配并调用具体处理器(Controller)。
        6)Controller执行并返回ModelAndView对象。
        7)HandlerAdapter将ModelAndView返回给DispatcherServlet。
        8)DispatcherServlet传给ViewResolver进行视图解析。
        9)ViewResolver返回具体视图给DispatcherServlet。
        10)DispatcherServlet渲染视图并响应用户。

以下是前端后分离的过程:

Java 面试篇之SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)_第2张图片

        11.0 Springboot 自动配置原理?

        Spring Boot 的自动配置原理基于 @SpringBootApplication 注解,它封装了 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。@EnableAutoConfiguration 是核心,它通过 @Import 导入配置选择器,读取 META-INF/spring.factories 文件中的类名,根据条件注解决定是否将配置类中的 Bean 导入到 Spring 容器中。

Java 面试篇之SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)_第3张图片

        12.0 Spring 的常见注解有哪些?

        Spring 的常见注解包括:

        1)声明 Bean 的注解:@Component、@Service、@Repository、@Controller。

        2)依赖注入相关注解:@Autowired、@Qualifier、@Resource。

        3)设置作用域的注解:@Scope。

        4)配置相关注解:@Configuration、@ComponentScan、@Bean。

        5)AOP 相关注解:@Aspect、@Before、@After、@Around、@Pointcut。

        13.0 SpringMVC 常见的注解有哪些?

        SpringMVC 的常见注解有:

        1)@RequestMapping:映射请求路径。

        2)@RequestBody:接收 HTTP 请求的 JSON 数据。

        3)@RequestParam:指定请求参数名称。

        4)@PathVariable:从请求路径中获取参数。

        5)@ResponseBody:将 Controller 方法返回的对象转化为 JSON。

        6)@RequestHeader:获取请求头数据。

        7)@PostMapping、@GetMapping 等。

        14.0 Springboot 常见注解有哪些?

        Spring Boot 的常见注解包括:

        1)@SpringBootAplication:由 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 组成。

        2)其他注解如 @RestController、@GetMapping、@PostMapping 等,用于简化 Spring MVC 的配置。

        15.0 MyBatis 执行流程?

        MyBatis的执行流程如下:
        1)读取MyBatis配置文件mybatis-config.xml。
        2)构造会话工厂SqlSessionFactory。
        3)会话工厂创建SqlSession对象。
        4)操作数据库的接口,Executor执行器。
        5)Executor执行方法中的MappedStatement参数。
        6)输入参数映射。
        7)输出结果映射。

Java 面试篇之SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)_第4张图片

        16.0 Mybatis 是否支持延迟加载?

        Mybatis 支持延迟加载,即在需要用到数据时才加载。可以通过配置文件中 lazyLoadingEnabled 配置启用或禁用延迟加载。

        17.0 延迟加载的底层原理知道吗?

        延迟加载的底层原理主要使用 CGLIB 动态代理实现:

        1)使用 CGLIB 创建目标对象的代理对象。

        2)调用目标方法时,如果发现时 null 值,则执行 SQL 查询。

        3)获取数据后,设置属性值并继续查询目标方法。

        18.0 Mybatis 的一级、二级缓存用过吗?

        Mybatis 的一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,作用域为 Session,默认开启。二级缓存需要单独开启,作用域为 Namespace 或 mapper,默认也采用 PerpetualCache,HashMap 存储。

        19.0 Mybatis 的二级缓存什么时候会清理缓存中的数据?

        当作用域(一级缓存 Session/ 二级缓存 Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被清空。

 篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

你可能感兴趣的:(Java,面试题,Java面试题,java,spring,面试)