java常见框架Spring,SpringMVC,SpringBoot,Springcloud 以及 MyBatis2024常见面试问题


1.MyBatis的运行原理

在MyBatis运行开始时需要先通过Resources加载全局配置文件.

下面需要实例化SqlSessionFactoryBuilder构建器.

帮助SqlSessionFactory接口实现类DefaultSqlSessionFactory.

在实例化DefaultSqlSessionFactory之前需要先创 建XmlConfigBuilder解 析 全 局 配 置 文 件 流,并 把 解 析 结 果 存 放 在Configuration中.

之后把Configuratin传递给DefaultSqlSessionFactory.

到此SqlSessionFactory工厂 创 建 成 功.

由SqlSessionFactory工 厂 创 建SqlSession.

每次创建SqlSession时,都需要由TransactionFactory创建Transaction对象,同时还需要创建SqlSession的执行器Excutor,最后实例化DefaultSqlSession,传递给SqlSession接口.

根据项目需求使用SqlSession接口中的API完成具体的事务操作.如果事务执行失败,需要进行rollback回滚事务.如果事务执行成功提交给数据库.关闭SqlSession到此就是MyBatis的运行原理

2.SpringMVC运行原理

(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。

(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。

(3)解析到对应的Handler(也就是我们平常说的Controller控制器)后,开始由HandlerAdapter适配器处理。

(4)HandlerAdapter会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑。(5)处理器处理完业务后,会给DispatcherServlet返回一个ModelAndView对象。

(6)DispatcherServlet将ModelAndView传给ViewResolver视图解析器。ViewResolver解析后返回具体的View

(7)DispaterServlet对返回的View进行视图渲染,再去响应用户。

3.Spring Boot运行原理以及加载顺序

运行原理:

SpringBoot项目中都有一个带有@SpringBootApplication注解的 启动 类 ,该 启动 类 中的SpringApplication.run()方 法 会 加载@SpirngBootApplication注解,而该注解包含了三大主要功能,也就是三个注解,分别是:

第一个:@SpringBootConfiguration,这个注解相当于Spring基础框架中的@Configuration注解,他可以将此类定义为Spring框架的配置类。

第 二 个 :@EnableAutoConfiguration,这 个 注 解 可 以 将spring-bootautoconfigurer.jar和xxx-autoconfigurer.jar加载到spring容器中,然后就可以自动启动命名为XxxAutoConfiguration.java这样的配置类。

第三个:@ComponentScan,这个注解可以扫描@SpringBootApplication所在启动类的同包及其子包中的组件类。组件类就是添加了@Repository、@Service、@Controller或@Component注解的类。

加载顺序:

默认先去读取项目config目录下的配置文件,而且properties文件比yml文件优先级高所以先去读取config/application.properties然后是config/application.yml。

然后去加载项目根目录下的配置文件也是先读取application.properties,再去读取application.yml,接下来去类路径下的config中 读 取 ,先 加载resources/config/application.properties,后 加 载resources/config/application.yml最后去类路径下去读取,先读取resources/application.properties后读取resources/application.yml。

除了spring boot中application配置文件以外,还有spring cloud中bootstrap配置文件,Spring Boot默认不加载bootstrap配置文件,需要在项目中引用spring-cloud-context才能使用,bootstrap只能存放 在classpath下(即resources中 ),支 持bootstrap.properties和bootstrap.yml两种写法,properties的优先级高于yml。

如果在resource中有bootstrap和application配置文件,bootstrap配置文件高于application配置文件。application配置文件内容可以替换/覆盖bootstrap配置文件内容。

4.请说Spring中的IOC和DI

IOC即控制反转,是一种设计思想,把对于对象的创建,初始化,销毁等工作交给spring容器来做,spring容器来控制对象的生命周期。他的一个常用的实现方式是DI依赖注入,DI依赖注入就是Spring容器根据对象之间的依赖关系完成对象的创建以及组装的过程。

5.请说Spring中的AOP

AOP就是面向切面编程。其本质是通过预编译和运行时动态代理方式实现程序功能统一维护。通过AOP技术,我们可以对程序的业务逻辑(主要是service层)进行隔离增强,从而提高程序的可重用性。Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标类中的 代 码 ,动 态 地 将 横 切 逻 辑 和 业 务 编 织 在 一 起 ;接 着 ,Proxy利 用InvocationHandler动态创建一个符合某一接口的的实例,生成目标类的代理对象。如果代理类没有实现InvocationHandler接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

6.aop的几种实现方式

1、aspectj静态代理,编译期间将aspectj(切面)织入Java字节码中,运行时就是增强之后的aop对象。2、jdk动态代理,支持对接口的代理。Proxy类利用InvocationHandler接口动态创建一个符合某一接口的实例,生成目标类的代理对象。3、cglib动态代理,支持对类的代理(该类无需实现接口)。利用Enhancer工具类返回目标对象的子类对象(即代理对象),实现.MethodIntercepter接口,重写intercept方法中通过反射调用目标方法并添加增强代码,实现aop。补充:Spring Aop包括jdk动态代理和cglib动态代理。

7.请说一下Spring

Spring是一个轻量级框架,能够简化企业级应用开发,减少代码量;Spring的核心框架是AOP (面向切面)与I0C (控制反转),I0C说白了就是跟容器要对象,其中DI,依赖注入就是给属性赋值; AOP就是根据动态代理,分为切面,切入点和通知。Spring还提供对jdbc的轻量级封装;还提供声明式事物。Spring还根据MVC设计模式开发出SpringMVC框架。

8.Bean的生命周期

实例化->属性赋值->初始化->销毁

9.SpringSession的原理

当客户端访问服务端的时候,服务端会判断客户端的cookie中是否携带了session键值对

如果cookie中没有session键值对就会创建Session对象,然后把这个Session对 象 保 存 在redis数 据 库 中 ;

每 个Session对 象 都 包 含 了 创 建 时 间creationTime、最 大 存 活 时 间 键maxInactiveInteval和 最 后 访 问 时 间lastAccessTime三组键值对。

如果cookie中有session键值对,就根据session键值对的value拼接成spring:session:sessons:value去redis中取出对应的Session对象;

然后根据Session对 象 的lastAccessTiime属 性 和maxInactiveInterval属 性 来 判 断Session是否过期。

如果Session已经过期就重新创建一个Session对象,并再次保存到redis数据库中。如果Session没有过期,就将lastAccessTime属性更新。

10.请说说对springBoot的理解

Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

11.请说说对springCloud的理解

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

12.请说说对spring Security的原理

1.用户在浏览器中随意输入一个URL

2. Spring Security会判断当前是否已经被认证(登录)如果已经认证,正常访问URL。如果没有被认证跳转到loginPage()对应的URL中,显示登录页面。

3.用户输入用户名和密码点击登录按钮后,发送登录url

4.如果url和loginProcessingUrl()一样才执行登录流程。否则需要重新认证。

5.执行登录流程时首先被UsernamePasswordAuthenticationFilter进行过滤,取 出 用 户 名 和 密 码 ,放 入 到 容 器 中 。根 据usernameParameter和passwordParameter进行取用户名和密码,如果没有配置这两个方法,默认为请求参数名username和password

6.执行自定义登录逻辑UserDetailsService的实现类。判断用户名是否存在和数据库中,如果不存在,直接抛出UsernameNotFoundException。如果用户名存在,把从数据库中查询出来的密码通过org.springframework.security.core.userdetails.User传递给Spring Security。Spring Security根据容器中配置的Password encoder示例把客户端传递过来的密码和数据库传递过来的密码进行匹配。如果匹配成功表示认证成功。

7.如果登录成功,跳转到successForwardUrl(转发)/successHandler(自己控制跳转方式)/defaultSuccessUrl(重定向)配置的URL8.如果登录失败,跳转到failureForwardUrl/failureHandler/failureUrl

13.springmvc的主要组件

(1)前端控制器DispatcherServlet(不需要程序员开发)作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet就减少了其它组件之间的耦合度。

(2)处理器映射器HandlerMapping(不需要程序员开发)作用:根据请求的URL来查找Handler(3)处理器适配器HandlerAdapter注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。

(4)处理器Handler(需要程序员开发)

(5)视图解析器ViewResolver(不需要程序员开发)作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)

(6)视图View(需要程序员开发jsp)View是一个接口,它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

14.springmvc的优点

1)可以支持各种视图技术,而不仅仅局限于JSP;

(2)与Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(handlerMapping),处 理 器 适 配 器(HandlerAdapter),视 图 解 析 器(ViewResolver)。

(4)支持各种请求资源的映射策略。

15.springboot的注解

启动类上面的注解是@SpringBootApplication,它也是Spring Boot的核心注解,主要组合包含了以下3个注解:

@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude ={ DataSourceAutoConfiguration.class })。@ComponentScan:Spring组件扫描。

16.spring中bean的作用域

①singleton使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

②prototype使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。

③request该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

④session该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

⑤global-session该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

17.spring的常用注解

@Component

主要用于将java类注入到spring框架中,相当于在XML配置文件中的<bean id=”xxx” class=”xxx”/>

@Autowired

它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作(DI依赖注入工作)

@Qualifier

指定注入Bean的名称

@Scope

来显式指定Bean作用范围

@Controller

用于对Controller实现类注解

@Service

用于对Service实现类注解

@Repository

用于对Dao实现类注解

18.SpringMVC中常用注解

@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数

@requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数

@ResponseBody自动将返回值转换为json字符串

19.说一下对AOP的理解和依赖注入的方式

1.接口注入

2.Setter方法注入

3.构造方法注入


  • 34
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值