当前位置: 首页 > java >正文

Spring八股文

参考:Spring AOP深度解析:依赖注入、控制反转与Bean生命周期-CSDN博客

Spring概述

1.1 谈谈你对Spring的理解

Spring是可以构建java应用所需的一切基础设施,通常Spring指的就是Spring Framework。

核心解释

  • IOC:控制反转
  • AOP:面向切面编程
  • 容器:包含并管理应用对象的生命周期

1.2 Spring的优缺点是什么?

优点:
①解耦和方便开发:spring容器进行对象的创建和管理。
②AOP的支持:面向切面编程,实现日志和权限拦截等功能。
③声明事务的支持:通过配置进行事务管理,不需要手动编写。
④方便集成各种框架。

缺点:
①使用大量反射机制,占内存,不如直接调用效率高。
②没有做到依赖管理。

1.3 IOC和DI

1. IOC 控制翻转

  •  定义:将创建对象的方式交给Spring来管理,应用程序需要的时候直接向Spring拿,而不是自己采用new的方式创建

2. DI 依赖注入

  • 通过反射,动态地向对象中注入它所需要的其他对象
  • 注入的方式:setter方法、构造器注入、注解自动注入(@Autowired、@Resource、@Value)
//没有IOC
User user  = new User();//有IOC-注解
@Autowired
private User user;

如果让你设计一个SpringIoc,你觉得会从哪些方面考虑这个设计?

  1. Bean的生命周期管理:需要设计Bean的创建、初始化、销毁等生命周期管理机制,可以考虑使用 工厂模式和单例模式来实现。
  2. 依赖注入:需要实现依赖注入的功能,包括属性注入、构造函数注入、方法注入等,可以考虑使 用反射机制和XML配置文件来实现。
  3. Bean的作用域:需要支持多种Bean作用域,比如单例、原型、会话、请求等,可以考虑使用Map 来存储不同作用域的Bean实例。
  4. AOP功能的支持:需要支持AOP功能,可以考虑使用动态代理机制和切面编程来实现。
  5. 异常处理:需要考虑异常处理机制,包括Bean创建异常、依赖注入异常等,可以考虑使用try-catch机制来处理异常。
  6. 配置文件加载:需要支持从不同的配置文件中加载Bean的相关信息,可以考虑使用XML、注解或 者Java配置类来实现。

1.4 AOP

面向切面的编程,在 AOP 中最小的单元是“切面”。一个“切面”可以包含很多种类型和对象,对它们进行模块化管理,例如事务管理。

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或模块{例如事务处理、日志管理、 权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展 性和可维护性。

核心注解:

@Aspect
作用:声明一个类是一个切面。这个类包含了通知和切点的定义
@Before
作用:在目标方法执行之前执行通知。
@After (也称为 最终通知)
作用:在目标方法执行结束后执行通知。
@Around (功能最强大的通知)
作用:环绕目标方法执行。它可以在方法执行前后自定义行为,并且可以决定是否继续执行目标方法、返回自定义值或抛出异常。
@EnableAspectJAutoProxy
作用:启用 Spring 对 AspectJ 切面编程的支持。@Around("execution(* com.example.service.*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {// 方法执行前的逻辑... (相当于 @Before)// 核心:决定是否及何时执行目标方法Object result = pjp.proceed(); // 方法执行后的逻辑... (相当于 @AfterReturning)return result; // 返回目标方法的返回值
}

1.5 IOC和AOP是通过什么机制来实现的?

Spring IOC 实现机制

  • 反射:Spring IOC容器利用Java的反射机制动态地加载类、创建对象实例及调用对象方法,反射允许在运行时检查类、方法、属性等信息,从而实现灵活的对象实例化和管理。
  • 依赖注入:IOC的核心概念是依赖注入,即容器负责管理应用程序组件之间的依赖关系。Spring通 过构造函数注入、属性注入或方法注入,将组件之间的依赖关系描述在配置文件中或使用注解。
  • 设计模式 - 工厂模式:Spring IOC容器通常采用工厂模式来管理对象的创建和生命周期。容器作为 工厂负责实例化Bean并管理它们的生命周期,将Bean的实例化过程交给容器来管理。
  • 容器实现:Spring IOC容器是实现IOC的核心,通常使用BeanFactory或ApplicationContext来管理 Bean。BeanFactory是IOC容器的基本形式,提供基本的IOC功能;ApplicationContext是 BeanFactory的扩展,并提供更多企业级功能。

Spring AOP 动态代理

Spring AOP—深入动态代理 万字详解(通俗易懂)_aop使用动态代理-CSDN博客

Spring AOP的实现依赖于动态代理技术。动态代理是在运行时动态生成代理对象,而不是在编译 时。它允许开发者在运行时指定要代理的接口和行为,从而实现在不修改源码的情况下增强方法的 功能。

Spring AOP支持两种动态代理:

  • 基于接口的代理(JDK动态代理):和代理对象需要有相同的接口、通过反射来实现动态代理
  • 基于类的代理(CGLIB动态代理): 是通过继承目标类来实现代理目标方法的。通过字节码文件来实现动态代理的,通过获取目标类的字节码文件来代理目标方法。
特性JDK 动态代理CGLIB 代理
是否需要接口✅ 是❌ 否(继承类)
实现方式反射+动态字节码继承类 + 字节码生成
性能创建快,执行慢(反射)创建慢,执行快(ASM)
Spring 默认实现接口用 JDK没有接口用 CGLIB

    动态代理和静态代理的区别

    代理是一种常用的设计模式,目的是:为其他对象提供一个代理以控制对某个对象的访问,将两个 类的关系解耦。代理类和委托类都要实现相同的接口,因为代理真正调用的是委托类的方法。 

    • 静态代理:由程序员创建或者是由特定工具创建,在代码编译时就确定了被代理的类是一个静态代理。静态代理通常只代理一个类;
    • 动态代理:在代码运行期间,运用反射机制动态创建生成。动态代理代理的是一个接口下的多个实现类。

    1.6 IOC与AOP结合

    在 Spring 框架中,IOC 和 AOP 结合使用,可以更好地实现代码的模块化和分层管理。例如: 通过 IOC 容器管理对象的依赖关系,然后通过 AOP 将横切关注点统一切入到需要的业务逻辑中。 使用 IOC 容器管理 Service 层和 DAO 层的依赖关系,然后通过 AOP 在 Service 层实现事务管理、 日志记录等横切功能,使得业务逻辑更加清晰和可维护。

    1.7 反射

    反射机制是指程序在运行状态下,对于任意一个类,都能够获取这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意属性和方法。

    • 1. 运行时类信息访问:反射机制允许程序在运行时获取类的完整结构信息,包括类名、包名、父 类、实现的接口、构造函数、方法和字段等。
    • 2. 动态对象创建:可以使用反射API动态地创建对象实例,即使在编译时不知道具体的类名。这是通 过Class类的newInstance()方法或Constructor对象的newInstance()方法实现的。
    • 3. 动态方法调用:可以在运行时动态地调用对象的方法,包括私有方法。这通过Method类的 invoke()方法实现,允许你传入对象实例和参数值来执行方法。
    • 4. 访问和修改字段值:反射还允许程序在运行时访问和修改对象的字段值,即使是私有的。这是通 过Field类的get()和set()方法完成的。

    1.8 循环依赖问题

    循环依赖指的是两个类中的属性相互依赖对方:例如 A 类中有 B 属性,B 类中有 A属性,从而形成了一个依赖闭环。

    产生情况:

    • 构造方法+依赖注入
    • setter方法+依赖注入+单例模式
    • setter方法+依赖注入+多例模式

    通过三级缓存解决循环依赖单例问题:

    1. 实例化 Bean:Spring 在实例化 Bean 时,会先创建一个空的 Bean 对象,并将其放入一级缓存中。
    2. 属性赋值:Spring 开始对 Bean 进行属性赋值,如果发现循环依赖,会将当前 Bean 对象提前暴露给后续需要依赖的 Bean(通过提前暴露的方式解决循环依赖)。
    3. 初始化 Bean:完成属性赋值后,Spring 将 Bean 进行初始化,并将其放入二级缓存中。
    4. 注入依赖:Spring 继续对 Bean 进行依赖注入,如果发现循环依赖,会从二级缓存中获取已经完 成初始化的 Bean 实例。

    都是 Map类型的缓存

    • 1. 一级缓存:存储的是已经完全初始化好的 bean,即完全准备好可以使用的bean实例。
    • 2. 二级缓存:存储的是早期的bean引用,即已经实例化但还未完全初始化的bean。
    • 3. 三级缓存:存储的是ObjectFactory对象,这些对象可以生成早期的bean引用。

    1.9 spring框架中都用到了哪些设计模式

    • 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
    • 代理设计模式 : Spring AOP 功能的实现。
    • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
    • 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作 的类,它们就使用到了模板模式。
    • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去 访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
    • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
    • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了 适配器模式适配Controller。

    2.0 spring 常用注解有什么?

    • @Autowired 注解 :主要用于自动装配bean。当Spring容器中存在与要注入的属性类型匹配的bean 时,它会自动将bean注入到属性中。就跟我们new 对象一样。
    • @Component:标记类并实例化为bean。当一个类被@Component注解标记时,Spring会将其实例化为一个bean,并将其添加到Spring容器中。
    • @Service:标记类作为服务层的组件。它是@Component注解的特例,用于标记 服务层的bean,一般标记在业务service的实现类。
    • @Repository:标记类作为数据访问层的组件。它也是@Component注解的特例,用于标 记数据访问层的bean。这个注解很容易被忽略,导致数据库无法访问。
    • @Controller:标记类作为控制层的组件。它也是@Component注解的特例,用于标记控制层的bean。这是MVC结构的另一个部分,加在控制层
    • @Configuration:标记类作为Spring的配置类。配置类可以包含@Bean注解的方法, 用于定义和配置bean,作为全局配置。
    • @Bean :标记方法作为Spring的bean工厂方法。当一个方法被@Bean注解标记时, Spring会将该方法的返回值作为一个bean,并将其添加到Spring容器中,如果自定义配置,经常用到这个注解。
    • @Transactional 是:Spring 框架中用于声明式事务管理的核心注解

    2.1说一下 spring 的传播机制与事务隔离?

    传播行为描述
    REQUIRED(默认)如果当前有事务就加入,没有则新建事务。
    REQUIRES_NEW挂起当前事务,新建一个事务。
    SUPPORTS有事务就加入,没有事务就非事务方式运行。
    NOT_SUPPORTED总是以非事务方式运行,如果有事务则挂起。

    五大隔离级别。

    • ISOLATION_DEFAULT: 默认值,使用数据库的隔离级别。
    • ISOLATION_READ_UNCOMMITTED: 读未提交。
    • ISOLATION_READ_COMMITTED: 读已提交。
    • ISOLATION_REPEATABLE_READ: 可重复读。
    • ISOLATION_SERIALIZABLE: 序列化。

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,

    主要分为编程式事务和声明式事务两种。

    2.2 Spring 事务

    编程式事务

    基于底层的APl 如 PlatformTransactionManager、TransactionDefinition 和 TransactionTemplate 等核心接口,需要是开发者在代码中手动的管理事务的开启、提交、回滚等操作。

    声明式事务

    Spring 支持声明式事务管理,即@Transactional注解,声明式事务管理建立在AOP之上。

    2.3 spring开启事务的方法

    ✅ 常用方式一:基于注解的声明式事务(推荐)

    • 步骤一:引入 Spring 事务依赖(Spring Boot 项目自动包含)
    • 步骤二:在配置类上启用事务支持
    • 步骤三:在方法或类上使用 @Transactional

    2.4spring事务(transational)失效

    详解Spring事务失效的八种常见场景_spring事务失效场景-CSDN博客

    1.事务方法访问的修饰符非public,导致事务失效:

    当事务方法的访问修饰符为非public时,Spring AOP无法正确地代理该方法,从而导致事务失效。这是因为Spring使用动态代理来实现声明式事务管理,而动态代理只能代理公共方法

    2.方法内部抛出了未被捕获的异常,导致事务无法正确回滚:

    Spring的事务管理默认行为是当方法抛出任何未捕获的运行时异常 (即RuntimeException及其子类) 时,事务会自动回滚。而 受检查异常(checked exception) 则默认不会触发事务回滚,除非显式配置。

    3.数据表本身不支持事务,导致事务失效:

    如果数据库表本身不支持事务,那么在使用Spring事务管理时可能会导致事务失效。在这种情况下,Spring无法通过数据库的原生事务机制来管理事务,从而无法正确执行事务的提交和回滚。

    4.存在循环依赖的情况,导致Spring无法正确代理事务

    循环依赖是指两个或多个Bean之间相互依赖,形成了一个闭环。当存在循环依赖的情况时,SpringIoC容器会尝试通过提前暴露实例(early exposure)的方式来解决依赖注入,但是这种情况下Spring无法正确代理被循环依赖的Bean,从而导致事务失效。

    5.方法自身(this)调用问题,导致事务失效:
    当方法内部通过 this 调用另一个方法时,Spring AOP无法拦截这种调用,从而无法对这种调用进行事务代理,导致事务失效。这是因为Spring的事务代理是基于动态代理或者CGLIB代理实现的,而this 调用会绕过代理对象,直接调用目标对象的方法。

    transational

    属性类型作用
    valueString指定使用的事务管理器Bean名称(多数据源时必用)
    propagationPropagation事务传播行为(核心考点)
    isolationIsolation事务隔离级别
    timeoutint事务超时时间(秒),-1表示不超时
    readOnlyboolean是否设置为只读事务(优化提示)
    rollbackForClass<?>[]指定哪些异常类必须回滚
    noRollbackForClass<?>[]指定哪些异常类不回滚

    Bean

     Bean的生命周期说一下?

    • 1. Spring启动,查找并加载需要管理的bean,进行Bean的实例化
    • 2. Bean实例化后对将Bean的引入和值注入到Bean的属性中
    • 3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
    • 4. 如果Bean实现了BeanFactoryAware接口的话,Spring将BeanFactory 容器实例传入setBeanFactory()方法
    • 5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext() 方法,将bean所在应用上下文引用传入进来。
    • 6. 如果Bean实现了PostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization() 方法。
    • 7. Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
    • 8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization() 方法。
    • 9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
    • 10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,销毁bean。同样,如果bean使 用了destory-method 声明销毁方法,该方法也会被调用。

    Bean的单例和非单例,生命周期

    Spring 中的 Bean 默认都是单例的。也支持将Bean设置为多例模式,即每次请求都会创建一个新的Bean实例。要将Bean设置为多例模式,可以在Bean定义中通过设置scope属性为"prototype"来实现。

    Spring Bean 的生命周期完全由 IoC 容器控制。Spring 只帮我们管理单例模式 Bean 的完整生命周期,对于非单例的 Bean,Spring 在创建好交给使用者之后,则不会再管理后续的生命周期。

    spring 中的 bean 它是线程安全的吗?

    Spring 容器默认会将 Bean 配置为单例模式,也就是说在默认情况下,Spring 容器会为每个 Bean 创建唯一的实例,这意味着这个实例会被多个线程共享,不是线程安全的。

    如果开发者需要在多线程环境下使用 Bean,需要确保 Bean 的状态是线程安全的,或者通过配置来确保每个线程都有自己的 Bean 实例。这通常可以通过在 Bean 的定义中设置作用域为 prototype 来实现。

    Spring bean的作用域有哪些?

    Spring框架中的Bean作用域定义了Bean的生命周期和可见性。理论上来说作用域只有 两种

    Singleton 单例作用域

    • 每一次从IOC容器获取指定Bean对象时,都会返回同一个实例对象
    • 适用场景:无状态Bean,如工具类、配置类、服务类等

    Prototype 原型作用域

    • 每一次从IOC容器获取指定Bean对象时,都会返回一个新的实例对象
    • 适用场景:有状态Bean,需要隔离状态的场景

    但在基于Spring框架下的Web应用中,增加了三种作用域

    Request 请求作用域:

    • 针对每一次HTTP请求都会创建一个新的Bean
    • 适用场景:HTTP请求级别的数据,如表单提交、请求参数处理

    Session 会话作用域

    • 针对Session会话,同一个Session共享同一个Bean实例,不同的Session则产生不同的Bean实例
    • 适用场景:用户会话数据,如登录信息、用户偏好设置

    Application 应用作用域

    • 整个Web应用中共享一个实例,类似于 ServletContext 级别
    • 适用场景:全局共享的配置或资源,如缓存、应用级配置

    Spring MVC

    1. 用户发出请求到前端控制器DispatcherServlet
    2. DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
    3. HandlerMapping找到具体的处理器,返回处理器执行链(包括处理器和拦截器)给DispatcherServlet
    4. DispatcherServlet调用HandlerAdapter(处理器适配器)
    5. HandlerAdapter经过适配调用具体的处理器(Handler即Controller的某个方法)
    6. 在方法上添加了@ResponseBody,因此通过HttpMessageConverter来返回结果转换为JSON并响应

    Spring Boot

    关系与区别总结

    Spring是简化企业开发java流程,提供开源应用框架和依赖注入的容器。具有:依赖注入/控制反转、面向切面编程、和模块化设计。

    但其配置繁琐,需要写大量的XML或Java配置来定义Beans、事务管理等

    SpringBoot,就是解决了这个问题,提供了自动配置起步依赖等机制。它是建立在spring框架上的应用程序。

    我们可以把spring理解为建筑材料而springboot就是图纸

    为什么使用springboot

    • 简化开发:Spring Boot通过提供一系列的开箱即用的组件和自动配置,简化开过程,开发人员可以更专注于业务逻辑的实现,而不需要花费过多时间在繁琐的配置上。
    • 快速启动:Spring Boot提供了快速的应用程序启动方式,可通过内嵌的Tomcat、Jetty或 Undertow等容器快速启动应用程序,无需额外的部署步骤,方便快捷。
    • 自动化配置:Spring Boot通过自动配置功能,根据项目中的依赖关系和约定俗成的规则来配置应用程序,减少了配置的复杂性,使开发者更容易实现应用的最佳实践。

    SpringBoot用到哪些设计模式?

    1. 代理模式:Spring 的 AOP 通过动态代理实现方法级别的切面增强,有静态和动态两种代理方式, 采用动态代理方式。
    2. 策略模式:Spring AOP 支持 JDK 和 Cglib 两种动态代理实现方式,通过策略接口和不同策略类, 运行时动态选择,其创建一般通过工厂方法实现。
    3. 装饰器模式:Spring 用 TransactionAwareCacheDecorator 解决缓存与数据库事务问题增加对事务 的支持。
    4. 单例模式:Spring Bean 默认是单例模式,通过单例注册表(如 HashMap)实现。
    5. 简单工厂模式:Spring 中的 BeanFactory 是简单工厂模式的体现,通过工厂类方法获取 Bean 实 例。
    6. 工厂方法模式:Spring中的 FactoryBean 体现工厂方法模式,为不同产品提供不同工厂。
    7. 观察者模式:Spring 观察者模式包含 Event 事件、Listener 监听者、Publisher 发送者,通过定义 事件、监听器和发送者实现,观察者注册在 ApplicationContext 中,消息发送由 ApplicationEventMulticaster 完成。
    8. 模板模式:Spring Bean 的创建过程涉及模板模式,体现扩展性,类似 Callback 回调实现方式。
    9. 适配器模式:Spring MVC 中针对不同方式定义的 Controller,利用适配器模式统一函数定义,定 义了统一接口 HandlerAdapter 及对应适配器类。

    SpringBoot中的约定大于配置

    约定大于配置是Spring Boot的核心设计理念,它通过预设合理的默认行为和项目规范,大幅减少开发者需要手动配置的步骤,从而提升开发效率和项目标准化程度。

    SpringBoot配置优先级

    命令行参数>jar包外的application.properties(有profile比没有的强)>jar包内的application.properties(有profile比没有的强)

    SpringBoot常用注解

    •  1. **@SpringBootApplication** - 这是 Spring Boot 应用的主注解,它组合了`@SpringBootConfiguration`、 `@EnableAutoConfiguration`和`@ComponentScan`的功能。它用于标记主配置类,开启自动配置并扫描组件。
    • 5. **@Bean** - 用于在配置类中定义单个 Bean。`@Bean`方法(用在方法上)返回的实例会被 Spring 容器管 理。
    • 6. **@Autowired** - 用于自动装配 Bean,可以作用于字段、构造函数或方法,Spring 会自动寻找类型匹配的 Bean 并注入。
    • 7. **@Repository、@Service、@Controller** - 分别用于标记数据访问层、业务逻辑层和控制层的组件,它们都是`@Component`的特例,提供 了额外的语义信息和特定于层的增强功能。
    • 8. **@RestController** - 是`@Controller`和`@ResponseBody`的组合,用于创建 RESTful 控制器,直接返回数据,而不 是视图。
    • 9. **@GetMapping、@PostMapping、@PutMapping、@DeleteMapping** - 这些注解用于映射 HTTP 请求到特定的处理方法,分别对应 GET、POST、PUT 和 DELETE 请 求。

    说几个启动器

    • 1. `**spring-boot-starter-web**` - 包含了Spring Web MVC和Tomcat嵌入式服务器,用于构建Web应用。
    • 2. **spring-boot-starter-thymeleaf** - 集成了Thymeleaf模板引擎,用于构建HTML5响应式布局页面。
    • 3. `**spring-boot-starter-security**` - 提供了Spring Security的集成,用于处理身份验证和授权。
    • 4. `**spring-boot-starter-test**` - 包含了JUnit、Hamcrest、Mockito等测试相关的依赖,简化了单元测试和集成测试的编写。
    • 5. **spring-boot-starter-aop** - 提供了AspectJ的集成,用于实现面向切面编程。
    • 6. **spring-boot-starter-data-rest** - 提供了RESTful服务的快速实现,基于Spring Data JPA。
    • 7. **spring-boot-starter-data-mongodb** - 支持MongoDB的集成,用于文档数据库的操作。
    • 8. **spring-boot-starter-data-redis** - 提供了对Redis的支持,用于键值存储和缓存。

    SpringBoot启动流程(重点)
    简单版:

    1. 创建Spring Application对象
    2. 准备运行环境
    3. 创建并刷新应用上下文
    4. 加载所有自动配置类
    5. 执行Application.run()方法

    SpringBoot 自动装配的原理

    在SpringBoot项目的引导类上有一个注解叫 @SpringBootApplication,

    在这个注解的里面,又有一个注解叫做:@EnableAutoConfiguration 即触发了自动装配

    @EnableAutoConfiguration 是实现自动化配置的核心注解。

    该注解里面 通过 @Import 注解导入了一个 自动配置导入选择器类 AutoConfigurationImportSelector在 自动配置导入选择器类 里会读取(该项目和该项目引用的)Jar 包的 META-INF/spring.factories文件在这些文件中记录了配置类的全类名,通过全类名找到对应的配置类,配置类中定义了Bean,再判断定义的Bean是否加了条件注解是否生效决定是否将其Bean的实例加载到Sping容器中(条件注解例如@ConditionalOnClass(xx)判断是否有对应的class文件(依赖),如果有则加载该Bean)

    Mybatis

    mybatis看这一篇就够了,简单全面一发入魂_mybatis一发入魂-CSDN博客

    MyBatis 是一个非常流行的 半自动化 ORM(对象关系映射)框架,主要用于 将 Java 对象与数据库中的 SQL 操作绑定起来

    MybatisPlus和Mybatis的区别?

    • MybatisPlus是一个基于MyBatis的增强工具库,旨在简化开发并提高效率。
    • 以下是MybatisPlus和 MyBatis之间的一些主要区别:
    • CRUD操作:MybatisPlus通过继承BaseMapper接口,提供了一系列内置的快捷方法,使得CRUD 操作更加简单,无需编写重复的SQL语句。
    • 代码生成器:MybatisPlus提供了代码生成器功能,可以根据数据库表结构自动生成实体类、 Mapper接口以及XML映射文件,减少了手动编写的工作量。
    • 通用方法封装:MybatisPlus封装了许多常用的方法,如条件构造器、排序、分页查询等,简化了 开发过程,提高了开发效率。
    • 分页插件:MybatisPlus内置了分页插件,支持各种数据库的分页查询,开发者可以轻松实现分页 功能,而在传统的MyBatis中,需要开发者自己手动实现分页逻辑。
    • 多租户支持:MybatisPlus提供了多租户的支持,可以轻松实现多租户数据隔离的功能。
    • 注解支持:MybatisPlus引入了更多的注解支持,使得开发者可以通过注解来配置实体与数据库表 之间的映射关系,减少了XML配置文件的编写。

    http://www.xdnf.cn/news/20584.html

    相关文章:

  • AIGC(AI生成内容)
  • Promise 实现原理:手写一个符合 Promises/A+ 规范的 Promise
  • 在object-c中方法多个参数怎么接收?
  • [R2-ospf-1-area-0.0.0.0] network 23.1.1.0 0.0.0.3其中的通配符理解
  • 死信 队列
  • Redis 从入门到精通:全平台安装与性能优化配置指南
  • centos8下载mysql5.7
  • 深入理解 IP 地址:概念、分类与日常应用
  • 20250907-02:LangChain 架构和LangChain 生态系统包是什么
  • Axure: 分组柱状图1
  • 【算法--链表】109.有序链表转换二叉搜索树--通俗讲解
  • C语言数组
  • spring-ai-alibaba-deepresearch 学习(十四)——CoderNode
  • 时序数据库简介和安装
  • shell编程-案例
  • 公链分析报告 - 模块化区块链1
  • Java 中的锁
  • 【系统分析师】第10章-关键技术:系统规划与分析(核心总结)
  • Mysql数据库——第一阶段
  • 教师工具箱 (Teacher Toolbox) 发布!
  • MySQL中实施排序(sorting)及分组(grouping)操作
  • 追根索源-卷积算法:AI世界里的内卷之王
  • 关键字 const
  • 使用MQTT.fx和ESP32连接Onenet平台
  • 构建高可用二级缓存系统
  • 20250907-0101:LangChain 核心价值补充
  • Tesseract,PaddleOCR的Python使用
  • PHP中各种超全局变量使用的过程
  • 基于CNN-SE Attention和SHAP可解释性分析的故障诊断matlab
  • 备战 2025 软考系统架构师