超详细的阿里字节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集合框架的根接口, ...
随机推荐
- variable ans might not have been initialized 报错,以及初始化注意点
他是说你没有初始化而已,一般只是个warning,如果是在不能跑,那就给他初始化一下. 注意,初始化可不是任意值哈! 就比如如果要算阶乘,你初始化就不能为0. 还有如果是比较大小这类,就不要把初始化统 ...
- Servlet学习之Tomcat控制台中文乱码问题
Tomcat控制台中文乱码问题 在更新了IDEA2020.1版本后,可以安装官方的简体中文插件,方便我们日常使用,但是更新后再运行Tomcat时,控制台的输出日志出现中文乱码问题,接下来告诉大家如何修 ...
- bzoj 2839 集合计数 容斥\广义容斥
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
- Electron构建、打包总结
提示:Application entry file "main.js" does not exist 解决: package.json中的build模块,添加files " ...
- RabbitMQ好文章推荐
文章来源:掘金 作者:申城异乡人 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 https://juejin.im/post/5ce644b9f ...
- Spring 方法替换 了解一下
其实说简单的就是一个A Bean 在执行本方法的时候并不执行,而是调用另一个B Bean方法 要求B implements MethodReplacer @Override public ...
- 面试被问:如果系统 CPU 突然飙升且 GC 频繁,你该如何排查?
出自:开源中国 原文:系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题. ...
- Python入门看这些,最详细学习书籍推荐
随着人工智能以及脚本开发火热,Python已经被推上一个非常火热的巅峰! 那么,想要学习Python却又不知道从哪里开始的朋友,看这里呀~ Python在整个编程语言来说,是比较容易上手,而且“见效” ...
- windows下Nginx+RTMP部署
在windows下部署参考博客:https://blog.csdn.net/l1028386804/article/details/80022437 参考这个部署完成后,一般没有什么问题,可以看到视频 ...
- java多线程(三):多线程单例模式,双重检查,volatile关键字
一.事先准备 首先准备一个运行用的代码: public class Singleton { public static void main(String[] args) { Thread[] thre ...