八股文理解

八股文
Spring(框架)
1、 单例bean是单例模式吗?
是,同样的名字对应同样的bean,只会创建一次,由spring容器进行管理,并且交给容器给管理,spring中bean默认是单例的,作用域默认singleton。在获取bean实例时,会先去判断bean是否已经存在,也就是去Map单例池中根据名字去查找bean,如果没有则创建好放入map中去
2、 SpringBean的生命周期?

 从beandefinition加载Bean信息
 实例化(推断构造方法)
 属性注入(@autowired按类型和@resource按名称)
 Aware接口
 初始化(方法一:实现InitializingBean的afterPropertiesSet方法【执行验证的动作】;方法二:在初始化方法上加@PostConstruct注解)
 看是否需要AOP,生成代理对象
 销毁bean
3、 Spring
1、Spring 是轻量级的开源的 JavaEE 框架
2、Spring 可以解决企业应用开发的复杂性
3、Spring 有两个核心部分:IOC 和 Aop
(1)IOC:控制反转,把对象创建,属性注入,对象之间的调用过程交给 Spring 进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
4、Spring 特点
(1)方便解耦,简化开发
(2)支持Aop 编程
(3)方便和其他框架进行整合
(4)方便进行事务操作
4、IOC
IOC底层
(1)xml 解析、工厂模式、反射
传统的方式我们是在每个类里面去new ,我们的对象,如果被引用的类的名字或者路径有变动,会影响到引用的类,所以通过工厂模式统一提供bean对象,再利用反射实例化对象,如果以后有类路径的变动,只需要改xml,这样降低了耦合度ean的作用域
在 Spring 里面,默认情况下,bean 是单实例对象
(1)singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用getBean 方法时候创建多实例对象
IOC 自动装配(自动注入)
根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入
IOC Spring 针对 Bean 管理中创建对象提供注解
@Component
@Controller
@Service
@Repository
@Bean
IOC 基于注解方式实现属性注入
@Autowired根据属性类型进行注入
@Qualifier根据名称进行注入
@Resource可以根据类型注入,可以根据名称注入
(4)@Autowired @Qualifier @Resource 有什么区别
1.所属的包不同 @Autowired 和@Qualifier 在spring的包下
@Resource 在jdk的包下
2.@Autowired 是根据属性类型进行自动装配
@Qualifier 是根据 属性名称进行自动装配,都是必须跟@Autowired一起用
@Resource 支持属性名称注入和属性类型注入
5、AOP
1、什么是 AOP
不通过修改源代码方式,在主干功能里面添加新功能

2、AOP(底层原理)

3、AOP相关术语

前置通知 Before
后置通知(返回通知) AfterReturning
最终通知 After
异常通知 AfterThrowing
环绕通知 Around
其中@After和 @AfterReturning的区别是前者异常也会执行 后者只有正常返回才会执行

4、AOP 操作介绍
1、Spring 框架一般都是基于 AspectJ 实现 AOP 操作
(1)AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作

2、基于 AspectJ 实现 AOP 操作
(1)基于 xml 配置文件实现
(2)基于注解方式实现(使用)

3、切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
注意:返回类型可以省略

5、 AOP 注解实现
1、在增强类上面添加注解 @Aspect @Component
2、配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,括号里面配置切入点
如:使用切入点表达式配置或者切入点方法
6、有多个增强类对同一个方法进行增强,设置增强类优先级
(1)在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高
@Order(1)

6、 spring事务(底层是AOP)
1、什么是事务
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

2、事务四大特性
(1)原子性
(2)一致性
(3)隔离性
(4)持久性
3、事务传播行为propagation
定义:多个声明事务的方法相互调用的时候,这个事务应该如何去传递
7种传播行为:
Required:默认,如果当前存在这个事务,就加入这个事务里面去执行,不存在就创建一个新的事务
Require_new:不论是否存在事务,都会开启一个新的事务去执行,新老事务相互独立,外部事务抛出异常不会影响内部事务的正常提交
Nested:如果当前存在事务,就嵌套到这个事务里面去执行,如果当前没有事务,就创建一个新的事务
Supports:支持当前事务,如果当前不存在事务,就以非事务的方式去执行
Not supported:以非事务的方式去执行,如果当前存在事务,就把当前事务挂起来
Mondatory:强制事务执行,如果当前不存在事务就抛出异常
Nerver:以非事务的方式去执行,如果存在当前事务就抛出异常
Spring的事务传播行为一般是不需要去定义的,默认Required,除非是在嵌套事务的情况下
4、事务隔离级别
(1)事务有特性为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)比如三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:第一次读到了是1 别人修改提交了事务改成了2 我第二次就变成了2 两次读的数据不一样
(5)虚读:第一次读到了1条数据 别人添加了数据并且提交了事务 我第二次读变成了2条数据,读的数据量变多了
(6)解决:通过设置事务隔离级别,解决读问题

5、声明式事务管理参数配置

timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算
readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
(3)设置 readOnly 值是 true,设置成 true 之后,只能查询
rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚
noRollbackFor:不回滚
(1) 设置出现哪些异常不进行事务回滚
6、XML 声明式事务管理
第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面
7、 Spring事务失效

以下是事务不生效的7中场景
1、权限访问问题
在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。
2、方法使用final修饰
在方法上使用final,子类就不能重写该方法,而Spring事务底层使用的是aop,那么在代理类中也就无法重写该方法
注意:方法是static,无法通过动态代理,实现事务,因为static方法不能被重写且不属于对象
3、同一个类中没有事务的A调用含有事务的B
这种是通过this调用的,而不是通过spring aop 动态代理对象去调用的
解决方案:
自己注入自己,spring的三级缓存解决了循环依赖的问题

4、类本身未被Spring管理
少写了注解,没有把类放到spring容器中去管理
5、多线程的情况下
不同的线程,获得的数据库连接不一样,从而是两个不同的事务
6、表本身不支持事务
比如mysql5之前,默认引擎myisam,不支持事务
如果想要支持事务,就把引擎改成innodb
7、未开启事务
传统的spring项目,需要在applicationContext.xml手动配置事务相关参数,才能生效
springboot默认开启了事务
以下是事务不回滚的5中场景
1、错误的传播特性
通过propagation参数可以设置传播特性,spring目前支持7中传播特性:
其中只有三种传播特性才会创建新的事务:required、requires_new、nested
2、使用try catch自己吞掉了异常
spring想要正常回滚,必须抛出它能够处理的异常,如果没有抛出,spring任务程序是正常的
3、手动抛出了Exception(非运行时异常)
spring默认情况下只会回滚RuntimeException和Error,对于普通的Exception它不会回滚
4、自定义了回滚异常与事务回滚异常不一致
抛出的异常和可以回滚的异常不一样,一般情况下,建议rollback设置成Exception或Throwable
5、嵌套事务回滚多了,需要局部回滚的地方未做异常控制
让报错的方法不往上抛就行了

8、 循环依赖
1、 定义:
两个或多个bean之间相互依赖,a依赖b,b又依赖a;a依赖自己
2、 产生的问题:
可能会导致无法完成bean创建流程,导致应用启动失败,spring解决了一部分循环依赖的问题,但没有完全解决,所以要尽可能避免循环依赖的出现,目前比较好的解决办法是分级解决
3、 spring解决的主要是哪种循环依赖
通过setter方法注入的单例bean的循环依赖
4、spring有三级缓存
一级:保存实例化、注入、初始化完成的bean实例
二级:用于保存实例化完成的bean实例
三级:用于保存bean工厂,以便后面有机会创建代理对象
SpringBoot(框架)
自动装配
1定义:
自动装配就是把第三方组件的并导入到loc容器中,不需要开发人员手动去编写bean配置,只需在启动类上添加@SpringBootApplication就可以完成自动装配了,这个注解他是复合注解,真正完全自动装配的注解呢其实是@EnableAutoConfiguration
2、三个核心技术
(1)引入starter,在启动依赖组件的时候,这个组件了必须包含一个@configuration配置类,再去通过@bean注解去声明需要导入到ioc容器里面的bean对象
(2)这个配置类是在第三方jar包中,通过spring装spring boot中约定大于俗成的理念呢,我们需要把配置类的的那个放在meta-info/spring.factors文件中,Springboot就可以知道这个第三方jar包配置类的所在位置,其实是依靠spring中的SpringFactorsLoader来实现的
(3)springboot他知道这个第三方jar包配置类之后呢,通过通过importSelector对这些配置类动态加载,这样就可以实现自动装配了

Redis(中间件)

  1. 什么是Redis?它主要用来什么的?
    key-value数据库;与mysql不同的是数据放在内存,读写速度非常快,每秒可以处理超过10万次读写操作,因此redis被广泛应用于缓存,另外redis也经常被用来做分布式锁,除此之外,redis还支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案

2.说说Redis的基本数据结构类型
命令不分大小写 key区分大小写

set key ex 过期秒 过期毫秒 NX|XX

NX: 如果不存在,才创建

XX: 如果存在key,就覆盖
大多数小伙伴都知道,Redis有以下这五种基本类型:
 String(字符串)应用场景:共享session、分布式锁,计数器、限流。

 Hash(哈希)应用场景:缓存用户信息等。

 List(列表)应用场景:消息队列,文章列表

 Set(集合,不可重复)应用场景:点赞、用户标签,生成随机数抽奖、社交需求(好友关注)。
 zset(有序集合)应用场景:排行榜,热搜。

它还有三种特殊的数据结构类型
 Geospatial(地图)
 Hyperloglog(统计)
 Bitmap(位图)
3. Redis为什么这么快?
(1)基于内存存储实现
(2)高效的数据结构
(3)合理的数据编码
(4)使用了IO多路复用
(5)Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。Redis 6.0 引入了多线程提速,它的执行命令操作内存的仍然是个单线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值