Java面试题(框架篇)持续更新中。。。

1、什么是Mybatis框架,和MybatisPlus有什么区别

        MyBatis是一个基于Java的持久化框架,它可以帮助开发者简化数据库操作。它通过XML或注解将Java对象与数据库表进行映射,提供了丰富的功能和灵活性。

        MyBatis Plus是MyBatis的增强工具,它在MyBatis的基础上扩展了更多的功能和便利的特性。MyBatis Plus提供了一套代码生成器,可以根据数据库表自动生成实体类、Mapper接口和SQL语句。此外,MyBatis Plus还提供了更多的方法和注解,如分页查询、条件构造器、逻辑删除、乐观锁等,使开发变得更加简单和高效。

        简而言之,MyBatis是一个基础的持久化框架,而MyBatis Plus是在MyBatis的基础上进一步增强和扩展的工具。使用MyBatis Plus可以简化开发流程,提高开发效率。

2、在mybatis 中,${} 和 #{} 的区别是什么?

#{} 是占位符,预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis 在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止 SQL 注入,提高系统安全性。

3、在mybatis 中,resultType 和 ResultMap 的区别是什么?

如果数据库结果集中的列名和要封装实体的属性名完全一致的话用resultType 属性

如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过 resultMap 手动建立对象关系映射,resultMap 要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来。resultMap还可以配置一对一和一对多关联查询

4、MyBatis中的动态SQL 是什么意思?

动态SQL是指在执行sql语句时,根据不同的条件动态地拼接SQL语句,以适应不同的需求。在MyBatis中,动态SQL可以通过使用if、choose、when、otherwise、foreach等标签来实现。通过动态SQL,可以在不同的条件下生成不同的查询条件、更新语句、插入语句等,从而提供更灵活的数据库操作。

5、Mybatis的使用流程?

  1. 引入MyBatis相关的依赖:需要在项目中引入MyBatis的相关的jar包或者maven依赖。

  2. 配置MyBatis的配置文件:在配置文件中配置数据库的连接信息,以及MyBatis的其他相关配置,例如插件、类型转换器等。

  3. 创建Mapper接口:创建一个接口,其中定义了与数据库交互的方法。

  4. 编写Mapper.xml文件:在Mapper.xml文件中,通过SQL语句定义Mapper接口中方法的具体实现。

  5. 创建SqlSessionFactory:通过SqlSessionFactoryBuilder构建一个SqlSessionFactory,用于创建SqlSession。

  6. 创建SqlSession:通过SqlSessionFactory创建一个SqlSession,可以通过SqlSession来执行SQL语句。

  7. 调用Mapper接口方法:在代码中调用Mapper接口定义的方法,来操作数据库。

  8. 关闭SqlSession:在最后需要手动关闭SqlSession,释放相关的资源。

6、什么是mybatis拦截器?

        MyBatis拦截器是一种可以在MyBatis执行SQL语句之前或之后对其进行拦截和处理的机制。拦截器可以用于实现一些额外的功能,例如日志记录、权限控制、缓存等。

        

7、对mybatis 缓存机制的理解?

        Mybatis 是一款开源的持久层框架,它提供了许多功能和特性,其中之一就是缓存机制。Mybatis 的缓存机制可以在减少数据库访问次数、提高系统性能的同时,还可以降低系统的负载。

        Mybatis 的缓存机制分为一级缓存和二级缓存。

        一级缓存是指在调用同一个 SqlSession 的多次查询中,如果查询的条件和参数都相同,则直接从缓存中获取结果,而不再去执行真正的数据库查询操作。一级缓存的范围是 SqlSession 级别的,即同一个 SqlSession 内的多次查询可以共享一级缓存。

        二级缓存是指多个 SqlSession 之间共享缓存的机制。当多个 SqlSession 执行相同的查询时,如果查询的条件和参数都相同,则会从二级缓存中获取结果,而不再去执行真正的数据库查询操作。二级缓存的范围是 Mapper 级别的,即同一个 Mapper 下的多个 SqlSession 可以共享二级缓存。

        Mybatis 的缓存机制是基于对象的,即缓存的是对象而不是数据库的记录。当查询结果的数据发生变化时,Mybatis 会自动更新缓存,保证缓存数据的一致性。此外,Mybatis 还提供了清除缓存的方法,可以手动清除缓存。

        需要注意的是,对于需要频繁进行增删改操作的表,应该谨慎使用缓存机制,以免造成数据不一致的问题。在这种情况下,可以通过手动清除缓存的方式来保证数据的一致性。

8、java注解的原理?

        Java注解的原理主要是基于反射机制实现的。在Java中,注解是一种用来对程序代码进行标注的特殊形式的注释,它可以被编译器、虚拟机或者其他工具读取,并根据注解提供的信息执行相应的操作。

Java注解的原理主要有以下几个步骤:

  1. 定义注解:使用Java语法中的元注解(如@Target、@Retention)来定义注解的作用范围和生命周期。
  2. 标注注解:将定义好的注解应用到程序代码中的特定位置(如类、方法、字段等)。
  3. 解析注解:通过反射方式获取被注解的元素,并解析注解的信息。
  4. 执行操作:根据解析到的注解信息,执行相应的操作,如生成文档、生成代码等。

        在Java中,通过反射机制可以获取类、方法、字段等的元数据信息,包括注解。通过反射获取到被注解的元素后,就可以解析注解的信息并执行相应的操作。这样就实现了对注解的处理和利用。

        注解的原理在编译期、运行期、类加载期都有所应用。在编译期,编译器会根据注解信息进行一些静态检查或生成相应的代码。在运行期,虚拟机可以通过反射获取到注解信息,并根据注解信息执行相应的操作。在类加载期,可以通过自定义类加载器加载注解,并利用注解进行一些特殊的处理。

        总结起来,Java注解的原理就是通过反射机制获取注解信息,并根据注解信息执行相应的操作。通过注解,可以为程序代码提供额外的元数据,并在编译、运行或加载期间对代码进行处理。

9、@Autowired 与@Resource的区别?

        @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

1. 共同点

        两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2. 不同点

(1)@Autowired注解是按照类型(byType)装配依赖对象

        @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

(2)@Resource默认按照ByName自动注入

        由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

10、Spring AOP的实现原理?SpringAOP中动态代理的理解?

        Spring AOP的实现原理是基于动态代理机制。在Spring AOP中,通过使用代理对象包装原始对象,当原始对象的方法被调用时,代理对象会在方法调用前后添加额外的处理逻辑。

        Spring AOP提供了两种类型的代理:基于接口的JDK动态代理和基于类的CGLIB动态代理。当目标对象实现了接口时,Spring AOP会使用JDK动态代理,否则会使用CGLIB动态代理。

        JDK动态代理是通过Java提供的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。代理对象实现了目标对象相同的接口,并且委托给InvocationHandler来处理方法的调用。在方法调用前后,InvocationHandler可以添加额外的逻辑。

        CGLIB动态代理是通过继承目标对象生成一个子类来实现的。代理对象是目标对象的一个子类对象,并且拦截了目标对象的方法调用。在方法调用前后,CGLIB动态代理可以添加额外的逻辑。

        在Spring AOP中,可以使用注解或XML配置来定义切面(Aspect)和切点(Pointcut),并将切面织入到目标对象中。当目标对象的方法被调用时,切面可以在方法调用前后执行特定的逻辑,例如日志记录、性能监控、事务管理等。

11、谈一谈你对IOC的理解? 谈一谈你对DI的理解?

        对于IOC(Inversion of Control,控制反转),我的理解是将程序的流程控制从代码中分离出来,通过框架或容器来管理对象的创建和组装。传统的程序开发中,代码负责创建和管理对象的实例化和依赖关系的维护,而在IOC中,这部分控制被转移到外部容器中。程序员只需要通过配置文件或注解等方式描述对象之间的关系,然后由容器来负责对象的创建和依赖注入。

        IOC的优势在于降低了类之间的耦合度,提高了代码的可维护性和可测试性。通过IOC容器可以方便地管理和替换对象,实现了解耦,使得程序的扩展和维护更加容易。

        对于DI(Dependency Injection,依赖注入),我的理解是通过IOC容器自动将所需的依赖注入到对象中。依赖注入是IOC的一种具体实现方式。通过依赖注入,对象无需自己创建和管理它所依赖的对象,而是将依赖的对象以参数、属性或构造函数的方式注入进来。

        DI的好处在于降低了代码的耦合度,提高了代码的可测试性和可扩展性。通过依赖注入,不同对象之间的关系由容器管理,使得对象之间的依赖关系更加清晰,易于理解和修改。

        总而言之,IOC和DI是一种思想和设计模式,通过将程序的控制权和依赖管理交给外部容器,降低代码的耦合度,提高代码的可维护性、可测试性和可扩展性。

12、SpringBoot 的优点?

        SpringBoot 对上述 Spring 的缺点进行的改善和优化,基于约定优于配置的思想,可

以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码

编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

        版本锁定:解决是 maven 依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本

使用了 Starter(启动器)管理依赖并能对版本进行集中控制,如下的父工程带有版本号,

就是对版本进行了集中控制.

<!--引入父工程-->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.0.RELEASE</version>

</parent>

        起步依赖:解决了完成某一个功能要整合的 jar 包过多的问题,集合了常用的 jar 包

        自动配置:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置

        内置 Tomcat:通过内置的 tomcat,无需再用其他外置的 Tomcat 就直接可以运行 javaEE

程序

        总之:人们把 Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建

庞大的 spring 项目,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们

关注与业务而非配置。

13、Spring Cloud 和 Spring Boot 的区别和关系?

        Spring Boot是一个用于快速构建独立的、基于Spring的应用程序的开发框架。它简化了Spring应用程序的配置和部署过程,通过自动配置和默认值提供了一个生产就绪的开发环境。使用Spring Boot,开发者可以更加专注于业务逻辑的开发,而不必关心底层的配置和部署。

        Spring Cloud是一个用于构建分布式系统和微服务架构的项目。它基于Spring Boot,提供了一系列支持微服务开发的组件和工具,例如服务注册和发现、负载均衡、断路器、分布式配置等。Spring Cloud通过这些组件和工具,简化了微服务架构的开发和管理。

        因此,可以说Spring Cloud是建立在Spring Boot之上的一个项目,它扩展了Spring Boot的功能,提供了更多面向微服务开发的特性和工具。使用Spring Boot和Spring Cloud,开发者可以更加便捷地构建和管理分布式系统和微服务架构。

14、Spring Boot常用注解

Spring Boot中常用的注解有:

  1. @SpringBootApplication:启动Spring Boot应用程序的主注解,用于标注启动类。
  2. @RestController:用于标注控制器类,该类中的方法返回的结果直接返回给客户端,而不是视图。
  3. @Controller:用于标注控制器类,该类中的方法返回的结果会经过视图解析器解析后再返回给客户端。
  4. @RequestMapping:用于映射请求路径和请求方法,可以标注在类级别和方法级别上。
  5. @PathVariable:用于获取请求路径中的参数。
  6. @RequestParam:用于获取请求参数。
  7. @RequestBody:用于获取请求体中的参数。
  8. @ResponseBody:用于将方法返回的结果直接写入HTTP响应体中。
  9. @Autowired:用于进行依赖注入。
  10. @Value:用于从配置文件中读取属性值。
  11. @ConfigurationProperties:用于将配置文件中的属性值注入到Bean中。
  12. @Component:用于标注一个类为Spring Bean。
  13. @Service:用于标注一个类为服务层组件。
  14. @Repository:用于标注一个类为数据访问层组件。
  15. @EnableAutoConfiguration:用于开启自动配置功能。

15、spring MVC和SpringBoot的区别?

        Spring MVC和Spring Boot是两个不同的概念。

        Spring MVC是一个基于Spring框架的MVC(Model-View-Controller)框架,用于构建Web应用程序。它提供了一种设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分。Spring MVC提供了一系列的注解和类,简化了开发Web应用程序的过程。

        Spring Boot是一个用于快速开发、轻量级的框架,基于Spring框架。它提供了很多自动化配置的功能,以简化Spring应用程序的开发过程。使用Spring Boot,开发者可以快速搭建一个可独立运行、功能完善的应用程序,并且不需要手动配置复杂的配置文件。

        所以,Spring MVC是一种Web框架,用于构建Web应用程序,而Spring Boot是一个快速开发框架,用于简化Spring应用程序的开发过程。可以说,Spring MVC是Spring Boot的一个组成部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值