超详细的阿里字节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集合框架的根接口, ...
随机推荐
- Spring Security系列之极速入门与实践教程
@ 目录 1. Spring Security 2. 实验环境准备 3. 日志级别修改 4. 配置用户名/密码 5. 数据库方式校验 6. 不拦截静态资源 7. 自定义登录页面 8. Remember ...
- 大数据篇:一文读懂@数据仓库(PPT文字版)
大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...
- 【Logisim实验】构建立即数-随机存储器-寄存器的传送
关于Logisim Logisim在仿真软件行列中算是比较直观的软件了,它能做的事情有很多,唯一不足的是硬件描述语言的支持,总体上来说适合比较底层的仿真,依赖于Hex值,通过线路逻辑设计能够较好的 关 ...
- SQLyog无操作一段时间后重新操作会卡死问题(解决办法)
这种是因为一段时间不操作后,服务器将空闲连接丢弃了,而客户端(sqlyog)不知道,导致长时间无响应,而超时之后,sqlyog 使用了新的连接,所以又可以顺畅操作了. 将会话空闲时间默认改为自定义,填 ...
- Alink漫谈(十五) :多层感知机 之 迭代优化
Alink漫谈(十五) :多层感知机 之 迭代优化 目录 Alink漫谈(十五) :多层感知机 之 迭代优化 0x00 摘要 0x01 前文回顾 1.1 基本概念 1.2 误差反向传播算法 1.3 总 ...
- python 安装 0x000007b错误解决及VC++ 安装第三方库报红
dll 版本不对 dll 可能是 32 位和 64 位的 ,安装的可能不对 下载 DirectX_DLL修复工具v3.5增强版 进行修复 VC++ 安装第三方库报红问题 使用 VS 2017 或者 V ...
- Flask+微信公众号开发(接入指南)
目录 一.注册公众号 二.启用开发者 三.配置服务器配置 四.开发自己的需求 五.写在最后 一.注册公众号 具体的注册过程,根据官方文档一步一步来即可.这里需注意的是订阅号还是服务号:有些比较好的开发 ...
- PHP unixtojd() 函数
------------恢复内容开始------------ 实例 把 Unix 时间戳转换为儒略日计数: <?phpecho unixtojd();?> 运行实例 » 定义和用法 uni ...
- PHP exp() 函数
实例 返回 'e' 的不同次方: <?phpecho(exp(0) . "<br>");echo(exp(1) . "<br>") ...
- Java主类的装载
在JavaMain()函数中调用LoadMainClass()函数加载Java主类.LoadMainClass()函数的实现如下: /* * Loads a class and verifies th ...