基础知识扫盲=2020-5-10

Spring

自动装配原理

--反射,feiled 通过反射注入引用。方法通过反射 invoke调用

 

Required 注解

打在方法上,如果使用前未初始化,会报错bean 未初始化

 

bean是线程安全的吗

不是,大部分bean都是无状态的,也不会有线程安全问题,如果有状态的,需要开发者处理线程安全问题。

 

什么是spring innerBean

一个bean 无论何时,只会被当做一个属性调用。

也就是在bean 内部再申明一个bean

 

Spring bean  作用域

5个,单例 原型、请求、会话、全局会话

 

Dubbo

注册中心集群整个挂掉了,还能通信吗

可以,消费者还能通过本地缓存找到服务提供者。

 

负载均衡策略

随机、轮询、最少活跃度、一致性hash

 

安全机制:

dubbo消费者发起服务通信的时候,需要提供注册中心发放的token、不允许绕开注册中心直连

 

dubbo协议,为什么消费者比服务提供者多

千兆网络下,打满提供者,需要20个消费线程。

 

dubbo协议,为啥不建议大数据传输

千兆网卡下,服务提供者网络传输满载支持的最大tps:14,

 

其他协议:

Rmi:java.rmi协议,阻塞式短链接,jdk序列化。

Hessian协议,底层采用http协议通信,序列化使用hessian二进制协议,内置servlet。dubbo缺省使用neety作为容器。

Thrift:支持跨语言

 

Mybatis

缓存相关:

一级缓存:

同一个会话相同的sql,第二次直接从一级缓存中提取数据

任何的 UPDATE, INSERT, DELETE 语句都会清空缓存。

可以选择scopre=statement。每次sqlmapper执行后,即清空缓存。

 

二级缓存:

应用级别的缓存,默认不开启

 

如何分页

sql分页,limit x,y

分页拦截器。本质还是构造limit,

通过id order by 分页

如何写一个插件

原理:使用jdk代理生成dao层接口的代理类,并在jdbc每个执行步骤前,做AOP切面,回调下面4个切入点

4个扩展点:执行、statementHander/parameterHandler/ResultSetHandler

#$区别,

#通过预编译,把sqlmapper的sql固定下来了,入参会加上''.有效的放置sql注入

$用在传入对象、或者排序的时候使用。直接拼装到sql中了。

 

延迟加载

就是一个有外联表的时候,sqlmapper中定义的返回对象中嵌套其他对象。

只嵌套对象使用的时候才去查db

 

JVM

对象创建、内存分配过程、对象的访问定位

对象创建:三个阶段:类加载、链接、初始化

类加载过程:

通过class全类名获取类的二进制流,使用自定义appClassLoader 加载对象、如果没有,则委派给父类加载器加载,。如果都没有,则appClassLoad进行加载

并将加载好的数据放入方法区

链接阶段:

校验:

二进制流解析,café babe 开头,符合虚拟机安全规范的数据

准备

初始化符号引用、默认值

解析

将常理池中符号引用改为直接引用

初始化:

执行cinit的默认方法,

 

 

内存分配过程:

Eden->servive0 ->servive1

大部分在eden创建

大对象直接进入老年代

长期存活的分配到老年代

空间担保

https://www.cnblogs.com/godoforange/archive/2019/09/21/11565505.html

 

对象的访问定位

jvm虚拟机栈中,栈帧中存放了,局部变量表。(方法返回、接口、操作数栈、对象引用)

通过局部变量表中的对象引用来实现对象的访问定位。

https://www.cnblogs.com/YYfish/p/6722258.html

句柄池访问,句柄池地址稳定。对象变化,句柄不变,对于线程存放的句柄地址不会改变

直接访问(hotspot),少一次定位。性能更好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的生成器(generator)是一种特殊的迭代器,可以用来逐步生成序列。与普通函数不同,生成器函数使用yield关键字来返回值,而不是return。当函数执行到yield时,函数会暂停并将yield后面的值返回给调用者,但是函数的状态仍然保留在内存中,可以再次恢复执行。 以下是一些生成器的用法: 1. 生成器表达式 Python中的生成器表达式与列表推导式类似,但是使用圆括号而不是方括号。它可以用来生成一个序列,而不是一次性生成整个序列。 示例: ``` gen = (x * x for x in range(10)) for i in gen: print(i) ``` 2. yield语句 yield语句可以用来定义生成器函数。当函数执行到yield语句时,函数会暂停并将yield后面的值返回给调用者。函数的状态仍然保留在内存中,可以再次恢复执行。 示例: ``` def generator_func(): for i in range(10): yield i * i gen = generator_func() for i in gen: print(i) ``` 3. send方法 send方法可以在生成器函数中向生成器发送一个值,并继续执行生成器函数。这个值可以通过yield语句返回。 示例: ``` def generator_func(): while True: x = yield print(x) gen = generator_func() next(gen) gen.send(10) ``` 4. yield from语句 yield from语句可以用来在生成器函数中调用另一个生成器函数。它可以让代码更加简洁,并且能够处理嵌套生成器的情况。 示例: ``` def child_gen(): for i in range(5): yield i def parent_gen(): yield from child_gen() gen = parent_gen() for i in gen: print(i) ``` 以上是一些生成器的用法,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值