超详细的阿里字节Spring面试技术点总结(建议收藏)
前言
Spring这个词对于Java开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务。现在很多互联网公司都把Spring作为招聘面试其中最重要的知识点之一来考核。
文末有福利~

一般Spring面试的哲学三问,是什么?为什么?怎么用?

先分享一个Spring知识点思维导图给大家

一、Spring框架功能整体介绍
1. Core
2. Beans (BeanFacotry的作用)
3.Context
4.Expression Language
二、Spring IOC容器底层注解使用
1.基于xml的形式定义Bean的信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义一个Bean的信息 -->
<bean id="car" class="com.demo.compent.Car"></bean>
</beans>
public static void main( String[] args )
{
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(ctx.getBean("person"));
}
2.基于读取配置类的形式定义Bean信息
@Configuration
public class MainConfig {
@Bean
public Person person(){
return new Person();
}
}
public static void main( String[] args )
{
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(ctx.getBean("person"));
}
三、Spring Ioc容器源码解析
IOC 容器启动的核心流程
i0:>org.springframework.context.support.AbstractApplicationContext#refresh
IOC容器刷新流程
i1>org.springframework.context.support.AbstractApplicationContext#prepareRefresh
i2> ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
i3>org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
i4>org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory
i5>org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcess
i6>org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
i7>org.springframework.context.support.AbstractApplicationContext#initMessageSource
i8>org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster
i9>org.springframework.context.support.AbstractApplicationContext#onRefresh
i10>org.springframework.context.support.AbstractApplicationContext#registerListeners
i11>org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
i12:org.springframework.context.support.AbstractApplicationContext#finishRefresh
四、Spring 是如何解决循环依赖的

1.代码实例:
//getter/setter
public class InstanceA {
private InstanceB instanceB;
}
public class InstanceB {
private InstanceA instanceA;
} <bean id="instanceA" class="com.tuling.circulardependencies.InstanceA">
<property name="instanceB" ref="intanceB"></property>
</bean>
<bean id="intanceB" class="com.tuling.circulardependencies.InstanceB">
<property name="instanceA" ref="instanceA"></property>
</bean>
2.可能存在的问题:
3.解决方案:
五、Spring Aop源码分析
AOP核心概念
1.横切关注点(对哪些方法进行切入)
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2.切面(aspect,把原来糅杂在业务逻辑代码中的非业务代码抽取出来,把功能 相同的放在一个类中形成一个切面)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3.连接点(joinpoint)(需要切入的点)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指 的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4.切入点(pointcut)
对连接点进行拦截的定义
5.通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异 常、最终、环绕通知五类
6.目标对象
代理的目标对象
7.织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8.引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
简单案例
public interface Calculate { /** * 加法 * @param numA * @param numB * @return */ int add(int numA,int numB); /** * 减法 * @param numA * @param numB * @return */ int reduce(int numA,int numB); /** * 除法 * @param numA * @param numB * @return */ int div(int numA,int numB); /** * 乘法 * @param numA * @param numB * @return */ int multi(int numA,int numB);}
==========实现类
public class TulingCalculate implements Calculate { public int add(int numA, int numB) { return numA+numB; } public int reduce(int numA, int numB) { return numA-numB; } public int div(int numA, int numB) { return numA/numB; } public int multi(int numA, int numB) { return numA*numB; }}
=========切面类
@Aspectpublic class TulingLogAspect { @Pointcut("execution(* com.tuling.TulingCalculate.*(..))") public void pointCut(){}; @Before(value = "pointCut()") public void methodBefore(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<前置通知>,入参"+ Arrays.asList(joinPoint.getArgs())); } @After(value = "pointCut()") public void methodAfter(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<后置通知>,入参"+Arrays.asList(joinPoint.getArgs())); } @AfterReturning(value = "pointCut()") public void methodReturning(JoinPoint joinPoint ) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<返回通知>,入参"+Arrays.asList(joinPoint.getArgs())); } @AfterThrowing(value = "pointCut()") public void methodAfterThrowing(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<异常通知>,入参"+Arrays.asList(joinPoint.getArgs())); }}
==========配置类
@Configuration@EnableAspectJAutoProxy public class MainConfig { @Bean public Calculate calculate() { return new TulingCalculate(); } @Bean public TulingLogAspect tulingLogAspect() { return new TulingLogAspect(); }}
六、Spring 事务源码解析
1.什么是事物?
2. 事物的特性(ACID)

什么是ACID?

(1)atomicity【原子性】
(2)Consistency【一致性】
(3)Isolation【隔离性】
(4)Durability【持久性】

篇幅有限,其他内容就不在这里一一展示了,这份Spring核心知识点一共176页PDF文档
关注公众号:程序员追风,回复 008 获取这份Spring核心知识点总结

最后
前言
Spring这个词对于Java开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务。现在很多互联网公司都把Spring作为招聘面试其中最重要的知识点之一来考核。
文末有福利~

一般Spring面试的哲学三问,是什么?为什么?怎么用?

先分享一个Spring知识点思维导图给大家

一、Spring框架功能整体介绍
1. Core
2. Beans (BeanFacotry的作用)
3.Context
4.Expression Language
二、Spring IOC容器底层注解使用
1.基于xml的形式定义Bean的信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义一个Bean的信息 -->
<bean id="car" class="com.demo.compent.Car"></bean>
</beans>
public static void main( String[] args )
{
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(ctx.getBean("person"));
}
2.基于读取配置类的形式定义Bean信息
@Configuration
public class MainConfig {
@Bean
public Person person(){
return new Person();
}
}
public static void main( String[] args )
{
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(ctx.getBean("person"));
}
三、Spring Ioc容器源码解析
IOC 容器启动的核心流程
i0:>org.springframework.context.support.AbstractApplicationContext#refresh
IOC容器刷新流程
i1>org.springframework.context.support.AbstractApplicationContext#prepareRefresh
i2> ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
i3>org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
i4>org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory
i5>org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcess
i6>org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
i7>org.springframework.context.support.AbstractApplicationContext#initMessageSource
i8>org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster
i9>org.springframework.context.support.AbstractApplicationContext#onRefresh
i10>org.springframework.context.support.AbstractApplicationContext#registerListeners
i11>org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
i12:org.springframework.context.support.AbstractApplicationContext#finishRefresh
四、Spring 是如何解决循环依赖的

1.代码实例:
//getter/setter
public class InstanceA {
private InstanceB instanceB;
}
public class InstanceB {
private InstanceA instanceA;
} <bean id="instanceA" class="com.tuling.circulardependencies.InstanceA">
<property name="instanceB" ref="intanceB"></property>
</bean>
<bean id="intanceB" class="com.tuling.circulardependencies.InstanceB">
<property name="instanceA" ref="instanceA"></property>
</bean>
2.可能存在的问题:
3.解决方案:
五、Spring Aop源码分析
AOP核心概念
1.横切关注点(对哪些方法进行切入)
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2.切面(aspect,把原来糅杂在业务逻辑代码中的非业务代码抽取出来,把功能 相同的放在一个类中形成一个切面)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3.连接点(joinpoint)(需要切入的点)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指 的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4.切入点(pointcut)
对连接点进行拦截的定义
5.通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异 常、最终、环绕通知五类
6.目标对象
代理的目标对象
7.织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8.引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
简单案例
public interface Calculate { /** * 加法 * @param numA * @param numB * @return */ int add(int numA,int numB); /** * 减法 * @param numA * @param numB * @return */ int reduce(int numA,int numB); /** * 除法 * @param numA * @param numB * @return */ int div(int numA,int numB); /** * 乘法 * @param numA * @param numB * @return */ int multi(int numA,int numB);}
==========实现类
public class TulingCalculate implements Calculate { public int add(int numA, int numB) { return numA+numB; } public int reduce(int numA, int numB) { return numA-numB; } public int div(int numA, int numB) { return numA/numB; } public int multi(int numA, int numB) { return numA*numB; }}
=========切面类
@Aspectpublic class TulingLogAspect { @Pointcut("execution(* com.tuling.TulingCalculate.*(..))") public void pointCut(){}; @Before(value = "pointCut()") public void methodBefore(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<前置通知>,入参"+ Arrays.asList(joinPoint.getArgs())); } @After(value = "pointCut()") public void methodAfter(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<后置通知>,入参"+Arrays.asList(joinPoint.getArgs())); } @AfterReturning(value = "pointCut()") public void methodReturning(JoinPoint joinPoint ) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<返回通知>,入参"+Arrays.asList(joinPoint.getArgs())); } @AfterThrowing(value = "pointCut()") public void methodAfterThrowing(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<异常通知>,入参"+Arrays.asList(joinPoint.getArgs())); }}
==========配置类
@Configuration@EnableAspectJAutoProxy public class MainConfig { @Bean public Calculate calculate() { return new TulingCalculate(); } @Bean public TulingLogAspect tulingLogAspect() { return new TulingLogAspect(); }}
六、Spring 事务源码解析
1.什么是事物?
2. 事物的特性(ACID)

什么是ACID?

(1)atomicity【原子性】
(2)Consistency【一致性】
(3)Isolation【隔离性】
(4)Durability【持久性】

篇幅有限,其他内容就不在这里一一展示了,这份Spring核心知识点一共176页PDF文档
关注公众号:程序员追风,回复 008 获取这份Spring核心知识点总结

最后
超详细的阿里字节Spring面试技术点总结(建议收藏)的更多相关文章
- java 多线程超详细总结——阿里大牛熬夜整理
引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...
- Springboot启动扩展点超详细总结,再也不怕面试官问了
1.背景 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片.Springboot更是封装了Spring,遵循约定大于配置,加上自动装配 ...
- 从零开始,Windows操作系统下的超详细的阿里云发布项目过程
==================== 步骤0: 购买阿里云服务器 ==================== 0.1 从来没有搞过外网部署的我,当然是先买服务器了,感谢很多小伙伴的帮忙 0.2 登录 ...
- 阿里P8整理Mysql面试题答案,助你“脱颖而出”,吊打面试官!(建议收藏)
前言 作为一名开发人员,每天英高都在和数据库进行着斗智斗勇,尤其是互联网行业,对MySQL的使用是比较多的.同样的,因为mysql的重要性以及普及性,在面试的时候一定是一个面试的重点或者说常问问题,说 ...
- 新鲜出炉,这是全网讲的最详细的springboot整合消息服务了吧,建议收藏!
springboot整合activeMq ActiveMq是Apache提供的开源消息系统采用java实现, 很好地支持JMS(Java Message Service,即Java消息服务) 规范 A ...
- Spark性能调优-RDD算子调优篇(深度好文,面试常问,建议收藏)
RDD算子调优 不废话,直接进入正题! 1. RDD复用 在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如下图所示: 对上图中的RDD计算架构进行修改,得到如下图所示的优 ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- c语言面试宝典(经典,超详细)
c语言面试宝典(经典,超详细) 2018年08月25日 09:32:19 chengxuyuan997 阅读数:7799 摘自:https://blog.csdn.net/chengxuyuan9 ...
- Java集合框架总结—超详细-适合面试
Java集合框架总结—超详细-适合面试 一.精简: A.概念汇总 1.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口, ...
随机推荐
- .NetCore 登录(密码盐+随机数)
一.理论部分 1.为什么要给密码加盐 我们在数据库中存入的密码一般不会是明文,都要通加MD5加密后存入,但是有些简单的密码加密后存入数据库也不安全,所有我们采用密码+盐再进行MD5加密存入数据库中. ...
- Google免费新书-《构建安全&可靠的系统》
前段时间riusksk在公众号分享的Google安全团队的新书,好书,全英原版,开源免费. 免费下载地址:https://static.googleusercontent.com/media/land ...
- VulnHub靶场学习_HA: Pandavas
HA: Pandavas Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-pandavas,487/ 背景: Pandavas are the warr ...
- jmeter混合场景的多种实现方式比较
性能测试设计混合场景,一般有几种方式,分别是每个场景设置一个线程组,使用if控制器,使用吞吐量控制器.不同的方式实现机制不一样,哪种方式相比而言更好呢?下面做一比较. 下面以混合访问百度首页和必应首页 ...
- math库常用函数
- Django学习路11_向数据库中添加 和 获取指定条件数据
在 views.py 中添加函数 向数据库中添加数据 def add_persons(request): for i in range(15): person = Person() flag = ra ...
- 求100以内所有奇数的和,存于字变量X中。
问题 求100以内所有奇数的和,存于字变量X中. 代码 data segment x dw ? data ends stack segment stack db 100 dup(?) stack en ...
- python基础day5_元组
元祖---只读列表,可循环查询,可切片 儿子不能改,孙子可能可以改.增加(主要看要操作的是属于列表还是元组) tu = (1,2,3,'alex',[2,3,4,'taibai'],'egon') t ...
- PHP imagecolorclosesthwb - 取得与指定的颜色最接近的色度的黑白色的索引
imagecolorclosesthwb — 取得与指定的颜色最接近的色度的黑白色的索引.高佣联盟 www.cgewang.com 语法 int imagecolorclosesthwb (s res ...
- 使用pdf.js实现前端页面预览pdf文档,解决了跨域请求
pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 官网地址:http://mozilla.github.io/pdf.js/ 下 ...