超详细的阿里字节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集合框架的根接口, ...
随机推荐
- DQL_MySQL
4.DQL(查询数据){SUPER 重点} 4.1DQL (Data Query Language : 数据查询语言) -所有的查询操作: Select 数据库中最核心的语言 create data ...
- SYN 攻击原理及解决方法
原理SYN foold攻击主要针对tcp通信三次握手期间做的手脚,所以要弄懂这个攻击的原理我们首先必须知道tcp三次握手的详细过程 由上图可知tcp三次握手顾名思义要经过三个步骤,这三个步骤分别是 客 ...
- 如何查看Oracle的版本
本人使用的软件是DataGrip 在控制台输入 select * from v$version;
- postman~界面介绍
本文摘抄自https://www.jianshu.com/p/b8b02afa74b1 官方文档:https://learning.getpostman.com/docs/postman/launch ...
- PHP fnmatch() 函数
定义和用法 fnmatch() 函数根据指定的模式来匹配文件名或字符串. 语法 fnmatch(pattern,string,flags) 参数 描述 pattern 必需.规定要检索的模式. str ...
- PHP strrev() 函数
实例 反转字符串 "Hello World!": <?php高佣联盟 www.cgewang.comecho strrev("Hello World!") ...
- jmeter中使用jdbc参数化
以读取mysql数据库为例 1.下载一个mysql驱动包,最好去mysql官网下载 下载网址:https://dev.mysql.com/downloads/connector/j/ Select O ...
- SqlServer 查询的几种方式以及数字函数、时间函数的应用总结(回归基础)
--语法:select * from 表名 *表示查询所有字段数据 select * from Class select * from Student select * from RankingLis ...
- 017_go语言中的指针
代码演示 package main import "fmt" func zeroval(ival int) { ival = 0 } func zeroptr(iptr *int) ...
- Docker 启动 Nginx
Docker 启动 Nginx 拉取镜像 docker pull nginx:1.17.9 启动步骤 # 创建 nginx 目录 mkdir -p /usr/local/nginx && ...