复习查漏补缺(二)
Spring中自动装配的4种方式
byName
通过byName方式自动装配属性的时候,在定义bean的属性时,property标签中设置autowired属性为byName,那么spring会自动查找一个与该属性名字相同或id相同的Bean,注入进来
byType
通过byType方式自动注入属性时,是在定义Bean的时候,在property标签中设置autowire属性为byType,那么Spring会自动寻找一个与该属性类型相同的Bean,注入进来。
constructor
通过构造器自动注入。在定义Bean时,在bean标签中,设置autowire属性为constructor,那么,Spring会寻找与该Bean的构造函数各个参数类型相匹配的Bean,通过构造函数注入进来。
autodetect
自动装配。如果想进行自动装配,但不知道使用哪种类型的自动装配,那么就可以使用autodetect,让容器自己决定。这是通过在定义Bean时,设置bean标签的autowire属性为autodetect来实现的。设置为autodetect时,Spring容器会首先尝试构造器注入,然后尝试按类型注入。
默认情况下,Spring是不进行自动装配的
Spring支持的事务管理类型有什么
Spring支持两种类型的事务管理
编程式事务
意味着你通过编程的方式管理事务,给你带来极大的灵活性,但是很难维护!
声明式事务
意味着你可以将业务代码和事务管理分离,只需要通过注解或者xml的方式来管理事务
编程式事务可以分为三种类型
- 基于AOP的声明式事务管理
- 基于AspectJ的声明式事务管理(Aspectj是一个AOP框架)
- 基于注解的声明式书事务管理
解释一下MyBatis中命名空间(namespace)的作用
解释: 在大型项目中,可能存在大量的sql语句,但是每个sql语句必须有一个唯一的标识(ID),所以很不容易保证唯一性,因此,在mybatis中,每个映射文件都有一个唯一的命名空间,这样定义后,只需要保证当前的映射文件中的sql语句的id不重复就可以避免冲突。
assert断言的场景
一般使用断言在开发或者测试的时候使用,为了保证程序的执行效率,断言在程序发布后是关闭的。断言包含一个布尔表达式,如果为false,会抛出一个AssertionError异常1
assert(m > 0); // throws an AssertionError if m <= 0
Redis为什么是单线程的
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈有可能是机器内存大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,加之多线程数据同步是个问题,所以使用单线程很合适
数据库的拆分
数据库拆分就是通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散在多个数据库主机上以达到分散主库负载的效果
什么时候才要拆分
当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这个时候就需要数据库拆分了
切分模式
垂直拆分(专库专用)
一个数据库有很多表组成,每个表对应着不同的业务,垂直切分是指按照业务将表进行切分,分不到不同的数据库上面,这样就可以通过把数据分散到不同的数据库进而减轻单库的压力。
优点
- 数据维护简单
- 拆分后业务清晰,拆分规则明确
- 系统之间整合或者扩展容易
缺点
- 部分业务无法Join,只能通过接口的方式解决,从而提高了系统复杂度
- 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高
- 事务处理复杂
水平切分
垂直切分之后,但是单机仍有瓶颈,那么可以使用水平切分。
水平切分和垂直切分的区别
水平切分是把一个数据库中的不同表拆到不同的数据库中,垂直切分是把一个数据库中的同一张表拆分到不同的数据库中。
理解
按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中
优点:
- 不存在单库大数据,高并发的性能瓶颈。
- 对应用透明,应用端改造较少。
- 按照合理拆分规则拆分,join操作基本避免跨库。
- 提高了系统的稳定性跟负载能力。
缺点:
- 拆分规则难以抽象。
- 分片事务一致性难以解决。
- 数据多次扩展难度跟维护量极大。
- 跨库join性能较差
关于水平切分学习,这个博客很好,强烈推荐