03-SSM框架
文章目录1. Spring框架中的单例bean是线程安全的吗2. 什么是AOP3. 你们项目中有没有使用到AOP4. Spring中的事务是如何实现的5. Spring中事务失效的场景有哪些6. Spring的bean的生命周期7. Spring中的循环引用8. 那具体解决流程清楚吗9. 构造方法出现了循环依赖怎么解决10. SpringMVC的执行流程11. Springboot自动配置原理12. Spring 的常见注解有哪些13. SpringMVC常见的注解有哪些14. Springboot常见注解有哪些15. MyBatis执行流程16. Mybatis是否支持延迟加载17. 延迟加载的底层原理知道吗18. Mybatis的一级、二级缓存用过吗19. Mybatis的二级缓存什么时候会清理缓存中的数据1. Spring框架中的单例bean是线程安全的吗候选人不是线程安全的。当多用户同时请求一个服务时容器会给每个请求分配一个线程这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改比如修改单例的成员属性就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装线程安全和并发问题需要开发者自行处理。通常在项目中使用的Spring bean是不可变状态如Service类和DAO类因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态如ViewModel对象就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。2. 什么是AOP候选人AOP即面向切面编程在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来实现公共模块复用降低耦合。常见的应用场景包括公共日志保存和事务处理。3. 你们项目中有没有使用到AOP候选人我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式找到需要记录日志的方法然后通过环绕通知的参数获取请求方法的参数例如类信息、方法信息、注解、请求方式等并将这些参数保存到数据库。4. Spring中的事务是如何实现的候选人Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截在执行方法前开启事务在执行完目标方法后根据执行情况提交或回滚事务。5. Spring中事务失效的场景有哪些候选人在项目中我遇到过几种导致事务失效的场景如果方法内部捕获并处理了异常没有将异常抛出会导致事务失效。因此处理异常后应该确保异常能够被抛出。如果方法抛出检查型异常checked exception并且没有在Transactional注解上配置rollbackFor属性为Exception那么异常发生时事务可能不会回滚。如果事务注解的方法不是公开public修饰的也可能导致事务失效。6. Spring的bean的生命周期候选人Spring中bean的生命周期包括以下步骤通过BeanDefinition获取bean的定义信息。调用构造函数实例化bean。进行bean的依赖注入例如通过setter方法或Autowired注解。处理实现了Aware接口的bean。执行BeanPostProcessor的前置处理器。调用初始化方法如实现了InitializingBean接口或自定义的init-method。执行BeanPostProcessor的后置处理器可能在这里产生代理对象。最后是销毁bean。7. Spring中的循环引用候选人循环依赖发生在两个或两个以上的bean互相持有对方形成闭环。Spring框架允许循环依赖存在并通过三级缓存解决大部分循环依赖问题一级缓存单例池缓存已完成初始化的bean对象。二级缓存缓存尚未完成生命周期的早期bean对象。三级缓存缓存ObjectFactory用于创建bean对象。8. 那具体解决流程清楚吗候选人解决循环依赖的流程如下实例化A对象并创建ObjectFactory存入三级缓存。A在初始化时需要B对象开始B的创建逻辑。B实例化完成也创建ObjectFactory存入三级缓存。B需要注入A通过三级缓存获取ObjectFactory生成A对象存入二级缓存。B通过二级缓存获得A对象后B创建成功存入一级缓存。A对象初始化时由于B已创建完成可以直接注入BA创建成功存入一级缓存。清除二级缓存中的临时对象A。9. 构造方法出现了循环依赖怎么解决候选人由于构造函数是bean生命周期中最先执行的Spring框架无法解决构造方法的循环依赖问题。可以使用Lazy懒加载注解延迟bean的创建直到实际需要时。10. SpringMVC的执行流程候选人SpringMVC的执行流程包括以下步骤用户发送请求到前端控制器DispatcherServlet。DispatcherServlet调用HandlerMapping找到具体处理器。HandlerMapping返回处理器对象及拦截器如果有给DispatcherServlet。DispatcherServlet调用HandlerAdapter。HandlerAdapter适配并调用具体处理器Controller。Controller执行并返回ModelAndView对象。HandlerAdapter将ModelAndView返回给DispatcherServlet。DispatcherServlet传给ViewResolver进行视图解析。ViewResolver返回具体视图给DispatcherServlet。DispatcherServlet渲染视图并响应用户。11. Springboot自动配置原理候选人Spring Boot的自动配置原理基于SpringBootApplication注解它封装了SpringBootConfiguration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration是核心它通过Import导入配置选择器读取META-INF/spring.factories文件中的类名根据条件注解决定是否将配置类中的Bean导入到Spring容器中。12. Spring 的常见注解有哪些候选人Spring的常见注解包括声明Bean的注解Component、Service、Repository、Controller。依赖注入相关注解Autowired、Qualifier、Resource。设置作用域的注解Scope。配置相关注解Configuration、ComponentScan、Bean。AOP相关注解Aspect、Before、After、Around、Pointcut。13. SpringMVC常见的注解有哪些候选人SpringMVC的常见注解有RequestMapping映射请求路径。RequestBody接收HTTP请求的JSON数据。RequestParam指定请求参数名称。PathVariable从请求路径中获取参数。ResponseBody将Controller方法返回的对象转化为JSON。RequestHeader获取请求头数据。PostMapping、GetMapping等。14. Springboot常见注解有哪些候选人Spring Boot的常见注解包括SpringBootApplication由SpringBootConfiguration、EnableAutoConfiguration和ComponentScan组成。其他注解如RestController、GetMapping、PostMapping等用于简化Spring MVC的配置。15. MyBatis执行流程候选人MyBatis的执行流程如下读取MyBatis配置文件mybatis-config.xml。构造会话工厂SqlSessionFactory。会话工厂创建SqlSession对象。操作数据库的接口Executor执行器。Executor执行方法中的MappedStatement参数。输入参数映射。输出结果映射。16. Mybatis是否支持延迟加载候选人MyBatis支持延迟加载即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。17. 延迟加载的底层原理知道吗候选人延迟加载的底层原理主要使用CGLIB动态代理实现使用CGLIB创建目标对象的代理对象。调用目标方法时如果发现是null值则执行SQL查询。获取数据后设置属性值并继续查询目标方法。18. Mybatis的一级、二级缓存用过吗候选人MyBatis的一级缓存是基于PerpetualCache的HashMap本地缓存作用域为Session默认开启。二级缓存需要单独开启作用域为Namespace或mapper默认也是采用PerpetualCacheHashMap存储。19. Mybatis的二级缓存什么时候会清理缓存中的数据候选人当作用域一级缓存Session/二级缓存Namespaces进行了新增、修改、删除操作后默认该作用域下所有select中的缓存将被清空。