第三天基础框架篇


一、介绍一下spring
spring的核心作用是框架整合,简化开发;
spring通过IOC与AOP两大核心实现以上效果:
1.首先说IOC,Spring提供了一个容器,用来创建对象,初始化对象,管理对象,也就是对象的控制权交给了容器,
对象由主动new变为被动的从容器中获取,这叫做IOC控制反转,咱们把这个容器叫做IOC容器;
2.IOC容器还会维护对象与对象之间的依赖关系,当我们使用对象时不仅可以直接从IoC容器中获取,
并且获取到的对象已经绑定了所有的依赖关系,这叫做DI依赖注入;
另外一个就是AOP,AOP其实是一种思想,也就是面向切面编程的思想,spring提供了实现,他可以在对不侵入原有代
码的情况下,对代码功能进行增强;其实就是通过动态代理技术实现了在方法执行之前,正常返回
之后,抛出异常之后,以及执行完成之后各个阶段做一些事情,从而实现队友有方法的增强;
AOP五种通知类型:方法执行之前,正常返回之后,抛出异常之后,以及执行完成之后,以及一个
顶前面四个的环绕通知

二、说一下你对动态代理的理解?常用的动态代理实现?

1.给某一个对象提供一个代理,并由代理对象控制对真实对象的访问,代理模式是结构型设计模式的
一种

2.动态代理的方式有两种:
 JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用
InvokeHandler来处理。
 CGLIB动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的
class文件加载进来,通过修改其字节码生成子类来处理。

三、说一说spring bean的生命周期?
spring生命周期就是bean从创建到销毁的过程,具体如下
spring在创建bean的时候,首先会根据bean的定义以及一些信息配置来实例化bean,然后bean若
实现了前置处理器或者后置处理器的接口后,就会实现他们对应的方法,比如若bean实现了
ApplicationContextAware()接口,setApplicationContext()方法会被调用,另外的具体的实现方法
记不太清除了,反正就是一些实现了就执行,实现了就执行这样的顺序一次判断,最后就是bean
如果实现了销毁的接口,就会将bean销毁,如果没有实现那就一直保留。
四、Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问
题呢?
默认单例,线程不安全,手动将singleton变更为prototype。

四、Spring的常用注解有哪些?
1、@Component
@Service
@Repository
@Controller
用来写在类上,告诉spring,创建该类的对象,并加载入IOC容器
@Bran 用来打在方法上,定义第三方bean使用
2、@Autowired - 用于在 spring bean 中自动装配依赖项。通过类型来实现自动注入bean。和
@Qualifier注解配合使用可以实现根据name注入bean。
3、@Qualifier - 和@Autowired一块使用,在同一类型的bean有多个的情况下可以实现根据name
注入的需求。
4、@Scope - 用于配置 spring bean 的范围。
5、@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
6、@Aspect,@Before,@After,@afterReturn,@afterThrow,@Around,@Pointcut - 用于
切面编程(AOP)

五、 Spring是如何声明式事务控制的,说说他的原理?
Spring支持编程式事务管理和声明式事务管理两种方式!
1.编程式事务控制:需要使用TransactionTemplate来进行实现,这种方式实现对业务代码有侵入
性,因此在项目中很少被使用到。
2.声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦
截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完
目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相
关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。

六、Spring三级缓存了解吗?各级缓存的作用是什么?

1.一级缓存:缓存已经经历了完整声明周期, 已经初始化完成的完整bean对象;但
是,一级缓存解决不了循环依赖
2.二级缓存:缓存早期的半成品bean对象(生命周期还没有走完);
用来解决对象创建过程中的循环依赖问题
早期暴露出去的Bean,其实也就是解决循环依赖的Bean。
早期的意思就是没有完完全全创建好,但是由于有循环依赖,就需要把这种Bean提前暴露出去。其实早期暴露出去的Bean跟完完全全创建好的Bean他们是同一个对象,
只不过早期Bean里面的注解可能还没处理,完完全全的Bean已经处理了完了,但是他们指的还是同一个对象,只不过它们是在Bean创建过程中处于的不同状态。
3.三级缓存:
缓存的是ObjectFactory, 表示对象工厂, 用来创建某个对象的;如果没有AOP的话确实可以两级缓存就可以解决循环依赖的问题,如果加上AOP,两级缓存是无法解决
的。
三级缓存中存的是 ObjectFactory<?> 类型的代理工厂对象,用于处理存在 AOP 时的循环依赖问题
存的是每个Bean对应的ObjectFactory对象,
通过调用这个对象的getObject方法,就可以获取到早期暴露出去的Bean。
注意:这里有个很重要的细节就是三级缓存只会对单例的Bean生效,
像多例的是无法利用到三级缓存的,通过三级缓存所在的类名DefaultSingletonBeanRegistry就可以看出,仅仅是对SingletonBean也就是单例Bean有效果。
注意:spring无法解决构造函数造成的循环依赖问题


七、springmvc
(一)介绍一下springMVC?
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把
Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部
分,简化开发,减少出错,方便组内开发人员之间的配合。
2、说一下springMVC的请求流程?
1.发起请求到前端控制器(DispatcherServlet)
2.前端控制器请求HandlerMapping查找 Handler,可以根据请求的uri以及请求方式进行匹配对应
的controller方法
3.处理器映射器HandlerMapping向前端控制器返回查找到的controller方法,然后调用处理器适配
器去调用controller方法
4.处理器适配器去执行controller方法
5.controller方法执行完成给适配器返回结果,处理器适配器将返回结果封装成向ModelAndView
对象返回给前端控制器,ModelAndView是springmvc框架的一个底层对象,包括 Model(数据模
型)和view(视图对象)
6.前端控制器请求视图解析器去进行视图解析,根据View对象中的逻辑视图名获取到实际的视图文

7.前端控制器进行视图渲染,视图渲染将模型数据model渲染进实际的视图文件,生成最终的视
图,返回个浏览器

(二)快速的说五个以上的springMVC常用注解?
1、@RequestMapping:用于映射请求路径,可以定义在类上和方法上。用于类上,则表示类中
的所有的方法都是以该地址作为父路径。
2、@RequestBody:注解实现接收http请求body体的json数据,将json转换为java对象。
3、@RequestParam:指定请求参数的名称 接收的是url问号后面的参数如/user?id=1
4、@PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数
5、@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。
6、@RequestHeader:获取指定的请求头数据

(三)springMVC中的拦截器与Servlet中的filter过滤器的区别?
过滤器:依赖于servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤
拦截器:依赖于SpringMVC框架,属于面向切面编程(AOP)的一种运用。

(四)springMVC的统一异常处理与拦截器是如何实现的?

1.他俩都是基于AOP面向切面编程技术实现的;
统一异常处理,只需要定义一个切面,切入点就是所有controller方法,通知类型选择抛出异常
之后,这样就可以处理所有的异常了;当然springMVC已经帮我们实现了,但是我们应该知道它是
如何实现的。
2.拦截器:实现同样基于AOP,只需要定义一个切面,切入点的话,你可以配置需要拦截的
controller接口,通知类型选择环绕,这样处理器方法执行之前,正常返回之后,方法执行完成之
后(正常返回,抛出异常都属于方法结束),就都可以做自己的业务了


八、mybatis

(一)介绍一下Mybatis?
MyBatis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了
几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML注解来操作数据库
(二)Mybatis中#{}和${}的区别?
1、#{}是预编译处理,${}是字符串替换。
2、Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
3、Mybatis在处理${}时,就是把${}替换成变量的值。
4、使用#{}可以有效的防止SQL注入,提高系统安全性。
注:正常的参数传递我们都是使用#{},只有一些特殊情况需要使用,比如参数是字段名,表名,
或者sql的关键字啥的,这个时候只能使用${}

(三)mybatis模糊查询like语句怎么写?
 name LIKE CONCAT('%',#{keyword},'%')

(四)当实体类中的属性名和表中的字段名不一样 ,怎么办?
第1种: 通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第2种: 通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系。
第3种,开启mybatis驼峰命名自动匹配映射

(五)说一下resultType与resultMap的区别?
数据库中列名和封装实体类中的属性名一致的话使用ResultType;如果不一样使用resultMap,然后
resultMap配置表和实体类的一一对应关系

(六)说一下你对mybatis动态sql的理解?常用的标签说一下。
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态
拼接sql的功能:
sql:可被其他语句引用的可重用语句块。
insert、update、delete、select:分别映射插入、更新、删除、查询语句。
if、choose、otherwise、when:用于在查询时有条件地包含where子句的一部分。
trim、where、set:用于处理查询条件语句拼接的情况。
foreach:用于在构建IN条件语句的时候,对一个集合进行遍历。
其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此
来完成动态sql的功能。
(七)mybatis如何实现分页功能?
1.看数据库吧,可以使用数据库自带的分页关键字,比如mysql的limit关键字,但是,如此的话跟
数据库耦合比较严重,后期更换数据库,问题比较大
2.可以引入PageHelper分页插件,插件可以屏蔽掉数据库方言不同的问题


九、mybatisfplus

(一)MyBatis-Plus 是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

(二)mybatisPlus是如何实现乐观锁的?什么样的情况下可以使用乐观锁?
乐观锁实现方式:
1、取出记录时,获取当前 version
2、更新时,带上这个 version
3、执行更新时, set version = newVersion where version = oldVersion
4、如果 version 不对,就更新失败
No. 27 / 64简单的说就是:
1、数据库中添加version字段
2、取出记录时,获取当前version
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全
的数据更新,就是防止多个用户同时修改同一条数据。适用于读多写少的场景,这样可以提高吞吐
量。比如秒杀之类的场景

十、springboot
(一)spring与springboot的关系?
spring可以帮助我们实现框架整合,快速开发;但是需要我们做ssm框架整合,大量的配置书写;springboot对spring使用上的一个加强;

(二)springboot的自动装配原理?

1.是这样的,因为springboot默认只会扫描它所在的包及其子包下的bean,但是第三方jar包里的他
是扫描不到的,为了解决这个问题,所以才加入的自动装配功能,spring底层会扫描classpath路径下meta-info文件夹的的spring.factories下配置的bean,
并加入到ioc容器中,需要时可以通过@AutoWied注解注入。

(三)运行一个SpringBoot项目有哪些方式?
1. 直接使用jar -jar 运行
2. 开发过程中运行main方法
3. 可以配置插件 , 将springboot项目打war包, 部署到Tomcat中运行
4. 直接用maven插件运行 maven spring-boot:run
(四)、Springboot的核心注解是哪个?
他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : 
@SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
@ComponentScan:Spring组件扫描


 

猜你喜欢

转载自blog.csdn.net/weixin_71921932/article/details/129913987