Spring框架篇

Bean线程
  • 单例bean不是线程安全的,
  • Spring框架中有一个@Scope注解,默认的值就是singleton,单例的。因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决
AOP
  • AOP面向切面编程,

    • 用于处理那些与业务无关, 但对多个对象产生影响的公共行为和逻辑,
    • 将其抽取并封装为一个可重用的模块, 称之为切面
    • 减少系统中的重复代码, 降低模块间的耦合度, 提高系统可维护性
  • 记录操作日志, 缓存

    • 使用aop中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,保存到数据库
  • extend:

    • 2. 什么是AOP?
      候选人:
      AOP,即面向切面编程,在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。
      
      3. 你们项目中有没有使用到AOP?
      候选人:
      我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库。
      
      4. Spring中的事务是如何实现的?
      候选人:
      Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截,在执行方法前开启事务,在执行完目标方法后根据执行情况提交或回滚事务。
      
  • 事务失效

    • 异常捕获处理
      • 事务通知只有捉到了目标抛出的异常才能进行后续的回滚处理, 如果目标自己处理掉异常, 事务通知无法知悉
      • 在catch块添加throw new RuntimeException(e)抛出
    • 抛出检查异常
      • Spring 默认只会回滚非检查异常
      • 配置rollbackFor属性–@Transactional(rollbackFor=Exception.class)
    • 非public放大导致的事务失效
      • 改为 public 方法
Bean的生命周期
  • 通过BeanDefinition获取bean的定义信息
  • 调用构造函数实例化bean
  • bean的依赖注入
  • 处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
  • Bean的后置处理器BeanPostProcessor-前置
  • 初始化方法(InitializingBean、init-method)
  • Bean的后置处理器BeanPostProcessor-后置
  • 销毁bean
Bean的循环依赖

在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象

  • Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:
一级缓存 singletonObjects 单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存 earlySingletonObjects 缓存早期的bean对象(生命周期还没走完)
三级缓存 singletonFactories 缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

Spring框架篇_第1张图片

  • 构造方法出现了循环依赖怎么解决?
    • A依赖于B,B依赖于A,注入的方式是构造函数
    • 原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入
    • 解决方案:使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建
SpringMVC

SpringMVC 是 Spring Framework 里的一个基于 MVC(Model-View-Controller,模型-视图-控制器)模式的 Web 框架,主要用于开发 Java Web 应用。它的作用是处理 HTTP 请求,并将请求数据传递给后台业务逻辑,最终返回给用户。

  • 执行流程:
    • 用户发送出请求到前端控制器DispatcherServlet
    • DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
    • HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
    • DispatcherServlet调用HandlerAdapter(处理器适配器)
    • HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
    • 方法上添加了@ResponseBody
    • 通过HttpMessageConverter来返回结果转换为JSON并响应
SpringBoot自动配置原理
  • @SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。
  • @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
  • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。
  • 其中@EnableAutoConfiguration是实现自动化配置的核心注解。 该注解通过@Import注解导入对应的配置选择器。内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
  • 条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。
Spring常见注解
12. 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. 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的配置。
MyBatis
  • MyBatis的执行流程如下:

    • 读取MyBatis配置文件mybatis-config.xml

    • 构造会话工厂SqlSessionFactory

    • 会话工厂创建SqlSession对象。

    • 操作数据库的接口,Executor执行器。

    • Executor执行方法中的MappedStatement参数。

    • 输入参数映射。

    • 输出结果映射。

  • 延迟加载

    • MyBatis支持延迟加载但默认没有开启
      • 延迟加载:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
    • 底层原理:
      • 延迟加载的底层原理主要使用CGLIB动态代理实现:
        1. 使用CGLIB创建目标对象的代理对象。
        2. 调用目标方法时,如果发现是null值,则执行SQL查询。
        3. 获取数据后,设置属性值并继续查询目标方法。
  • 一二级缓存:

    • 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
    • 二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储。需要单独开启,一个是核心配置,一个是mapper映射文件
    • 当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

你可能感兴趣的:(yy的学习之路,spring,java,数据库)