1. 什么是AOP、Spring AOP的底层原理是什么
AOP是面向切面编程,用于在不改变原有逻辑的基础上增加一些额外的功能,如事务管理、日志、缓存、权限控制等。
Spring AOP是基于代理的。
如果目标对象实现了接口,则默认采用JDK动态代理。
如果目标对象没有实现接口,则采用CgLib进行动态代理。
如果目标对象实现了接口,且强制CgLib代理,则采用CgLib动态代理。
2. 什么是IOC、IOC注入方式有哪些
IOC翻译为控制反转,他还有个别名为DI(依赖注入)。
IOC就是由IOC容器来负责对象的生命周期和对象之间的关系。
控制反转就是本来应该你做的事情,让系统去做,比如通常获取一个对象需要通过new,而使用IOC则是IOC将对象创建后注入到被注入的对象中。
注解注入(Spring)、构造器注入、setter方法注入、接口方式注入(不推荐)
3. Mybatis中 #{} 和 ${}的区别
#{}是预编译,可防止SQL注入。
${}是直接拼接在SQL语句中。
4. Spring Boot的核心注解是什么,它是由哪几个注解组成的
核心注解:@SpringBootApplication
包含:
@SpringBootConfiguration 实现配置文件功能
@EnableAutoConfiguration 打开自动配置功能
@CompoentScan 组件扫描功能
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取
5. SpringBoot 怎么读取配置文件
属性上使用@Value注解
类上使用@ConfigurationProperties注解
读取指定文件注解可在类上使用@PropertySource(不支持yml文件读取)
注入Environment对象获取到。
6. SpringCloud和Dubbo的区别
SpringCloud采用基于HTTP的REST API,Dubbo采用RPC方式。
7. SpringCloud的Hystrix断路器特性
请求熔断:请求服务失败量超过一定比例(默认50%)断路器会切换到开路状态,这时所有请求不会发送到后端服务,断路器在保持开路状态一段时间后(默认5秒),自动切换到半开路状态。这时如果下一次请求成功,断路器切回闭路状态,否则重新切换到开路状态。
服务降级:对于查询操作,可以实现一个fallback方法。当请求服务出现异常时,可以使用fallback方法返回的值。
依赖隔离:通过线程池来实现资源隔离,比如一个服务调用另外两个服务,如果这两个服务在同一线程池,那么如果一个服务卡住,后面的请求又来了,就会导致后面的请求都会卡住等待。
请求缓存:缓存上次请求结果,返回给后续请求。
请求合并:把多个请求合并成一个请求,提升效率。
三、MySQL数据库部分
1. 事物的四大特性和隔离级别
原子性:不可分割的操作单元,要么全部成功,要么回滚。
一致性:如果执行事物之前数据库是一致的,那么执行后还是一致的。
隔离性:事物操作之间彼此独立和透明,互不影响。
持久性:事物一旦提交,其结果就是永久的。
未提交读:允许脏读,其他事物只要修改了数据,即使未提交,本事物也能看到修改后的数据值。
提交读:只能读取到已提交的数据。
可重复读(innoDB默认):无论其他事物是否修改并提交了数据,这个事物中的数据不受影响。
串行读:完全串行化的读,每次读都要获得锁,读写相互都会阻塞。
2. MySQL优化相关
使用更小的整数类型、尽可能的定义字段为not null(否则会导致索引复杂)、
只创建需要的索引、分库分表。
使用explain检查复杂SQL语句、LIMIT语句尽量要跟order by或distinct、
插入多条数据时使用单条INSERT语句。
3. MySQL存储引擎InnoDB和MyISAM的区别
InnoDB支持事物,MyISAM不支持。
InnoDB支持外键,MyISAM不支持。
InnoDB是聚集索引,MyISAM是非聚集索引。索引和数据文件是分离的。
InnoDB必须要有主键(没有会自己找或创建),MyISAM可以没有。
InnoDB不保存表的行数,MyISAM用了一个变量保存表的行数。
InnoDB支持表、行级锁 默认行级锁,MyISAM只支持表级锁。
4. MySQL在哪些情况下不使用索引
like查询使用%开头不能使用索引,但用%结尾的可以使用索引。
where语句中使用<>或!=。
where语句中使用or,且没有把or中的所有字段加上索引。
where语句中对字段表达式操作。
where语句中使用NOT IN。使用简单的IN会使用索引。
5. MySQL分库分表策略
垂直切分:某个表字段过多,可以将不常用或字段长度较大的字段拆分出去到扩展表中。
水平切分:分为库内分表和分库分表,是根据表内数据的逻辑关系,按照不同的条件分散到多个数据库或表中。
四、扩展阅读
1. 关于Spring对JDK和CgLib动态代理的选择
通过查阅Spring-AOP包中的org.springframework.aop.framework.DefaultAopProxyFactory 类得到以下代码:
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
Class<?>[] ifcs = config.getProxiedInterfaces();
return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
}
}
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取
可以看到,Spring先使用isOptimize()方法、isProxyTargetClass()方法以及hasNoUserSuppliedProxyInterfaces()方法进行判断,这三个方法的含义分别如下:
isOptimize()
是否对生成代理策略进行优化
当返回值为true时为进行优化,如果有接口就代理接口(使用JDK动态代理),没有接口代理类(CGLIB代理)
当返回值为false时为不进行优化(default)
isProxyTargetClass()
是否强制使用CGLIB来实现代理
当返回值为true时为强制使用CgLib来实现代理
当范围值为false时为不强制使用CgLib来实现代理,而是首选JDK来实现代理(default)
hasNoUserSuppliedProxyInterfaces()
判断代理的对象是否只有指定了SpringProxy的接口或未实现接口
当返回值为true时代表没有实现接口或仅实现了指定SpringProxy的接口
当返回值为false时代表实现了接口,直接使用JDK动态代理
当了解这三个方法的含义后,接下来阅读代码就很简单了。
如果以上三个方法有任意方法返回值为true,就进入下一步判断,如果所有的返回值均为false,说明即不强制使用CgLib,或又实现了接口,则使用JDK动态代理。
在第二步判断中,首先对其targetClass进行了判空,然后判断它是否为接口或代理类,如果是则使用JDK动态代理。
反之,则使用CgLib进行代理。
2. 为什么CgLib可以代理任何类,但还是需要JDK的动态代理?CgLib和JDK动态代理的区别。
这就不得不说到CgLib的特点:创建速度慢但执行速度快,而JDK的动态代理与其刚好相反:创建速度快但执行速度慢。
如果在程序运行时不断地使用CgLib去创建代理的话,系统运行的性能会大打折扣,所以建议一般在系统初始化时采用CgLib来创建代理,并放入Spring的ApplicationContext中。
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取