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

Spring八股文 - 实践

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配置文件的编写。

    相关文章:

    Spring八股文 - 实践

    Spring八股文 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14p…...

    Morpheus 审计报告分享2:ChianLink 数据源有着不同的“心跳”

    漏洞信息 漏洞报告https://code4rena.com/audits/2025-08-morpheus/submissions/S-709漏洞代码https://github.com/code-423n4/2025-08-morpheus/blob/a65c254e4c3133c32c05b80bf2bd6ff9eced68e2/contracts/capital-protocol/ChainLinkDataConsumer.sol#L78-L107漏洞背景 Heart…...

    「嘶吼」第一章:吃饭睡觉打豆豆

    标准的鹅蛋脸圆圆的,瞪着一双大眼,大双眼皮显得格外精神,小肚子微微隆起,头发及腰,常常梳着高马尾。因为从小营养过剩,她个子在幼儿园里偏高,跑得快,力气大,小胳膊小腿扑腾起来可折腾人了,用不完的精力都用在调皮捣蛋上了。小胖妞?这无疑是对李鹤然最好的形容。一岁…...

    Clion 基础设置

    切换中英文切换老 UI 在 CLion 2024.2 及更高版本中,旧版 UI 已不再作为内置选项,而是通过插件提供。...

    《Vuejs设计与实现》第 16 章(解析器) 上 - 教程

    《Vuejs设计与实现》第 16 章(解析器) 上 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospac…...

    go代码(1)

    package main import "fmt" func main() { fmt.Println("hello world") } 运行: $ go run hello-world.go hello world $ go build hello-world.go $ ls hello-world hello-world.go $ ./hello-world hello world本文来自博客园,作者:gosamuel,转载…...

    7种常见的入侵检测系统规避技术解析

    本文详细解析了攻击者常用的7种入侵检测系统(IDS)规避技术,包括文件恶意软件、混淆技术、IP分片、源路由等,并提供了相应的缓解措施,帮助企业安全团队加强网络防护。7种常见的入侵检测系统规避技术 恶意攻击者使用各种规避策略渗透网络,而入侵检测系统(IDS)却未能察觉。了解…...

    js的引用

    js代码 JavaScript又称ECMAScript,常用的版本通常有es5以及es6 元素中的代码 a元素除了能定义链接地址,同样可以定义js <a href="javascript:window.alert(hello)">Hello</a>我们可以通过按钮的单击事件实现上面相同的效果,其中事件也就是什么情况下执…...

    P3957 [NOIP 2017 普及组] 跳房子

    题目描述 给出 \(n\) 个点的坐标 \(a_i\) 和权值 \(s_i\),每次向右移动正距离 \(p\),满足 \(d-x \le p \le d+x\) 且落在给定的点上,求使经过点值的最大和不小于 \(k\) 的最小 \(x\)。 思路 step1-二分答案 这道题我们要求的是最小的 \(x\),可显然我们无法将 \(x\) 设计到状…...

    C++中常用的STL容器

    C++中常用的STL容器: Vector:变长数组:数组长度是可以动态变化的,倍增 Pair<X,Y>:二元组:前后两个元素类型可以不同 string:字符串:常见的函数:substr()截取一段字串,c_str()返回字符串的头指针 queue:队列:先进先出,push()插入,pop() 弹出,front() 返回…...

    我的数据科学探索之旅:从兴趣到公考与学习计划

    一.关于我:不止于代码的多面手我的兴趣:在热爱里收获成长​ 生活中的我,总喜欢在艺术相关的领域折腾。从初中开始,我就爱上了跳舞,第一次跟着视频练基础动作时,肢体僵硬得像 “机器人”,连简单的 wave 都做不流畅,反复练习后还总跟不上节奏。但我没放弃,每周坚持练 3 …...

    MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统

    MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&quo…...

    JavaScript Array 对象

    JavaScript 中的 Array 对象是用于存储多个值的特殊类型的对象。 Array 是按顺序存储元素的,可以根据索引(从 0 开始)来访问它们。 创建数组 可以通过几种方式创建数组: 使用 Array 构造函数: let arr1 = new Array(3); // 创建一个长度为 3 的空数组 let arr2 = new Arr…...

    代码规范

    C++ 编码规范 一 版式 1.程序块缩进 4 个空格,只能使用空格键,不能使用 TAB 键。 2.相对独立的程序块之间、变量说明之后必须加空行,函数之间也用空行分开。 3.一行只写一条语句,if、for、do、while 等语句自占一行,且执行语句部分无论多少都要加括号 {}。 4.代码行之内应…...

    mac远程连接windows

    安装 Windows App 在app store 中安装windows app添加pcip可以在windows 电脑的终端上键入ipconfig查看ipv4地址。 双击连接 凭据是windows电脑的账户跟密码,例如Administrator,password 要求是在同一局域网内! 在mac终端上ping一下windows的ip看能否ping的通就知道了。...

    子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考

    使用泛型(推荐)public interface FlowHandlerGateway<P extends FlowApprovalPageCondition> {Page<FlowApprovalPage> pageQuery(P condition); }//父类 @Slf4j @Component @RequiredArgsConstructor public class FlowHandlerGatewayImpl<P extends FlowApp…...

    WebStorm代码一键美化

    还在手动调整代码格式?还在为团队代码风格不统一而头疼? 相信很多朋友都遇到过这样的痛苦场景:写完代码一团糟,看着就难受 团队成员代码风格千差万别,维护起来要命 每次提交代码前都要手动整理格式,费时费力上一篇《10分钟搞定Vue3项目》已经搭建好了项目基础架构,脚手架…...

    3分钟搞定Vue组件库

    还在为写前端页面发愁?还在为设计按钮、表格这些基础组件浪费时间? 经过上一篇《WebStorm代码一键美化》的学习,相信你已经掌握了 Prettier、ESLint、TypeScript 这三大开发神器。 今天,我要教你一个更厉害的招式:3分钟搞定高颜值UI组件库!学会这一招,你的前端开发效率将…...

    Golang中设置HTTP请求代理的策略

    在Golang中设置HTTP请求代理涉及 net/http包中的 http.Transport结构体,它控制着HTTP请求的细节。要定义代理,可以使用 http.ProxyURL函数配合 url.Parse函数来创建一个 url.URL对象,然后将该对象赋值给 Transport结构体的 Proxy字段。 以下是配置HTTP代理的典型步骤:引入必…...

    [开源免费] iGTTS(Gemini TTS) 文本转语音(TTS)的命令行工具。

    iGTTS(Gemini TTS) iGTTS(Gemini TTS) 开源免费的文本转语音(TTS)的命令行工具。 iGTTS(Gemini TTS) 是通过调用 Gemini TTS 的接口,实现文本转语音(TTS)的命令行工具。 添加 API key # 编辑 .zshrc: vim ~/.zshrc# 添加信息(导入环境变量): export GEMINI_API_KEY=&l…...

    结合Spring和MyBatis实现DAO层操作综述

    在Java企业级开发中,Spring框架和MyBatis持久层框架的结合使用已成为常见模式。下面进行详细介绍如何结合这两个框架实现DAO层(数据访问层)操作。 首先,我们需要明确Spring框架和MyBatis的角色定位。Spring是一个全方位的企业级开发框架,提供了包括但不限于依赖注入、事务…...

    202205_CHIMA_follow

    流量分析,CHIMA,应急响应,文件拼接Tags:流量分析,CHIMA,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202205_CHIMA_follow.zip发起攻击的IP地址受到攻击的资产的IP+Port上传的木马完整路径上传的文…...

    Lua脚本协助Redis分布式锁实现命令的原子性

    在实现Redis分布式锁的过程中,Lua脚本的使用可以确保命令的原子性,这是因为Redis会将整个Lua脚本执行作为一个不可分割的整体,从而在多客户端环境中保证数据的一致性和安全性。 分布式锁通常是为了在不同进程或服务器间同步访问共享资源。在Redis中,SETNX命令可以用来实现锁…...

    快读快写 学习笔记

    在OI中,经常有输入输出量巨大的题,这一类题一般需要非常快速的输入输出方式,于是便有了快读快写 下面是模板(原理无需理解,用的时候直接复制上就行): #include <cstdio> #include <cctype> using namespace std; int precision=-1; char buf[100000],*p1=bu…...

    Ubuntu 安装 CLion

    下载网址:https://www.jetbrains.com/clion/download/?section=linux 安装在 /opt/clion: sudo mkdir /opt/clion 将安装包解压到 /opt/clion: sudo tar -zxvf CLion-2025.2.1.tar.gz -C /opt/clion ls /opt/clion/clion-2025.2.1这样就安装好了。 启动: sh /opt/clion/cl…...

    AI编程实战

    不久前我用trace体验了一把AI编程,完成了一个股票交易记录软件的开发,这次有个紧急项目,有了上次的AI编程实践,我决定让AI编程帮我一把 工具选择 上次说千问没有IDE,但阿里云出了一个Qoder,在这个紧急项目之前,我刚好开始使用Qoder,接到紧急项目的时候,是时候让AI真正…...

    25/9/13(补)

    做了下20年csps的单选,错了两道,后边随机跳题了个之前wa的题(p7777 shelter),数学标签,有编号1~n的石子,用两种抓取方式吧石子抓完,第一种抓法是选一个数i把第i堆石子抓走,代价为ip。第二种是选两个数i,j,把第i,j堆石子抓走,代价为|i-j|q。 发现性质: 第一,二种方…...

    面向对象编程(OOP)的原则

    面向对象编程(OOP)的原则面向对象编程有一系列核心原则,这些原则指导着我们如何设计高质量、可维护和可扩展的软件系统。这些原则可以分为两大类:基本特性和设计原则。 一、面向对象编程的四大基本特性(基石) 1. 封装 (Encapsulation) 核心思想:将数据和对数据的操作捆绑…...

    【龙智Atlassian插件】Confluence周报插件上线AI智能总结,一键生成专业报告 - 实践

    【龙智Atlassian插件】Confluence周报插件上线AI智能总结,一键生成专业报告 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…...

    数字化(管理)系统的工具化思考

    一、引言:数字化转型的背景与逻辑 进入 21 世纪,信息技术、互联网、大数据、人工智能与物联网的迅速发展,使得企业与组织的运作方式发生了深刻变革。管理学界普遍认为,传统的经验管理与制度管理正逐步向 数字化管理系统 过渡。这不仅是工具更迭的问题,更是认知范式、管理模…...

    详细介绍:传统神经网络实现-----手写数字识别(MNIST)项目

    详细介绍:传统神经网络实现-----手写数字识别(MNIST)项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

    C#语言中使用using关键字

    在 C# 语言中,“using”关键字被用于不同的上下文和目的,它的用法大体上可以被分为三类:导入命名空间、简化资源管理和提供别名。 首先,"using"关键字最常见的用途是导入命名空间。这在 C# 程序中非常普遍,因为它可以允许程序员引用命名空间中定义的类型,而不需…...

    中育新版本OSS Token获取API分析

    中育新版本OSS Token获取API分析 在8/28更新中(或更早),中育彻底停用了旧版本的GenerateTokenAsyncAPI,转而使用GenerateTokenV2AsyncAPI,新的API使用了签名和一些不明所以的参数,并可能限制了可以上传的路径。 为了尽快迁移旧的工具、程序,我对web端的OSS逻辑进行了分析。…...

    25/9/12(补,上一篇是9/11的)

    把昨天没改完的码积木改完了,最终解法先发现一个性质是往上堆一个就算和下一个高度重叠也对下一个没有影响,所升序排完后设变量m(m初始等于a[1]),如果m比当前遍历到的a[i]大代表这个a[i]有重叠,更新答案,如果比a[i]小就让m=a[i]保持同频。 改完这题后又去改暑假的T3,就是…...

    动态编译 vs. 静态编译,容器时代那个更有优势?

    动态编译 vs. 静态编译,容器时代那个更有优势?一、动态编译 vs. 静态编译:一场关于“依赖”的战争 要理解静态编译,我们首先要明白它的对立面——动态编译,这也是 C、C++ 以及 Java、Python、C#、Ruby 等大多数主流语言所采用的方式。 1. 动态编译:运行时“借”东西 想象…...

    实用指南:操作系统类型全解析:从批处理到嵌入式

    实用指南:操作系统类型全解析:从批处理到嵌入式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

    【C++ 类和对象・高阶深化(下)】再探构造函数(含初始化列表),吃透 static 成员、友元、内部类及对象拷贝编译器优化 - 指南

    【C++ 类和对象・高阶深化(下)】再探构造函数(含初始化列表),吃透 static 成员、友元、内部类及对象拷贝编译器优化 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…...

    2

    C++ 数据结构数组 链表 队列 堆 树 map/set hashmysql 索引 索引就像是数据的目录。索引的好处就是可以提高查询速度,但是会占用物理空间,而且创建和维护索引要耗费时间,每次进行增删改操作都需要动态维护。索引的分类数据结构:B+ 树索引,hash,full-text物理存储:聚簇索…...

    VSCode 运行 C/C++ 程序

    VSCode 安装插件:重点参考: https://blog.csdn.net/icacxygh001/article/details/120981354 https://code.visualstudio.com/docs/cpp/config-linux#_running-the-build...

    3 字节

    进程与线程的区别 线程是轻量级进程,每个进程中都有唯一的主线程,主线程和进程是相互依存的关系。进程是资源分配和拥有的基本单位;线程是系统调度的基本单位进程拥有CPU 资源,内存资源,文件资源,句柄等;线程拥有程序计数器,寄存器,栈和状态字切换情况:进程由操作系统…...

    Springcloud Alibaba(一)

    一、什么是Springcloud Alibaba它是微服务概念的一种实现,解决了如下问题N个服务,如何管理?(服务治理 注册中心【服务的注册、发现、删除】)nacos N个服务,如何通信?feign N个服务,客户端如何访问?gateway N个服务,一旦出现问题了,怎么处理?(容错)sentinel N个服…...

    111111111

    1111111111...

    202204_DASCTF_SimpleFlow

    流量分析,DASCTF,WebShell,蚁剑AntSwordTags:流量分析,DASCTF,WebShell,蚁剑AntSword 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202204_DASCTF_SimpleFlow.zip 0x01. WP 1. 分析http协议,找到附件数据 …...

    使用 Winscope 跟踪窗口转换

    Winscope 是一款 Web 工具,可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope 界面,您可以通过重放、单步执行和调试过渡来针对每个动画帧检查这些服务的状态(无论…...

    25/9/12(补)

    做了下19csps初试,60多分,记不清了,反正能过,写完后改一道暑假没过的题,没改完就下课了...

    深入解析:“纳米总管”——Arduino Nano 的趣味生活

    深入解析:“纳米总管”——Arduino Nano 的趣味生活pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

    洛谷题目难度系统优化

    以下为优化后的难度系统:优化后难度 对应KaTex数学公式\(\color{FE4C61}{{入门}}\) \color{FE4C61}{{入门}}\(\color{F39C11}{{普及-}}\) \color{F39C11}{{普及-}}\(\color{FFC116}{{普及}}\) \color{FFC116}{{普及}}\(\color{FFD700}{{普及+}}\) \color{FFD700}{{普及+}}\(\c…...

    202112_摆烂杯_WhatAHack!

    流量分析Tags:流量分析,CTFSHOW 0x00. 题目 这是你沐师傅的站的流量,最近你沐师傅去跟着某讯搭了一个WP平台后发了一篇文章再测试了一下自己的网站就再也没去管过平台了。结果被某位名字貌似大概可能叫g4_simon的大黑阔给hack掉了网站,并进行了一些操作拿到了沐师傅放在平台里…...

    少儿 500 常用汉字 字帖

    500 常用汉字 每个字加入拼音 每个字加入笔画笔顺 少儿楷书练习下载链接如下 1-4画 5画 6画 7画 8画 9画 10画 11-16画...

    Ubuntu 安装 gcc

    命令 gcc --version 或者 gcc -v 能查看 gcc 版本。 未安装:安装命令: sudo apt update # 更新软件包源 sudo apt-get install build-essential gdb这样,GCC 就安装完成了。...