写点什么

凭借着这份 Spring 面试题,我拿到了阿里,字节跳动美团的 offer

用户头像
极客good
关注
发布于: 刚刚

System.out.println(ctx.getBean("person"));


}




2.基于读取配置类的形式定义 Bean 信息



@Configuration


public class MainConfig {


@Bean


public Person person(){


return new Person();


}


}




去容器中读取 Bean 的信息(传入配置类



public static void main( String[] args )


{


AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfig.class);


System.out.println(ctx.getBean("person"));


}






超详细的阿里字节 Spring 面试技术点总结(建议收藏)



三、Spring Ioc 容器源码解析


=====================================================================================



容器创建前期准备工作



**


1.AnnotationConfigApplicationContex 的创建为我们做了什么?**



AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);



(1)看下构造函数



>i1:org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext



i2>


org.springframework.context.support.GenericApplicationContext#GenericApplicationContext()调用父类的构造方法



i3>


org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()自己的构造方法



i3.1>


org.springframework.context.annotation.AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader 为 bean 定义读取器赋值



i3.1.1>


org.springframework.context.annotation.AnnotatedBeanDefinitionReader#getOrCreateEnvironment 创建环境



i3.2>


org.springframework.context.annotation.ConditionEvaluator 创建一个条件计算器对象



i3.2.1>this.registry = registry; 初始条件计算器的 bean 定义注册器



i3.2.2> this.beanFactory = deduceBeanFactory(registry); 初始化 bean 工厂



i3.2.3>this.environment = (environment != null ? environment : deduceEnvironment(registry));为环境对象赋值



i3.2.4>this.resourceLoader = (resourceLoader != null ? resourceLoader :deduceResourceLoader(registry)); 为资源加载器赋值



i3.3>


AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);为容器中注册系统的 bean 定义信息



i4>: this.scanner = new


ClassPathBeanDefinitionScanner(this); 创建类路径下的 bean 定义扫描器



i4.1>


:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#registerDefaultFilters 注册包扫描默认的规则



i4.2>


:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setEnvironment 设置环境



i4.3>


org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setResour 设置资源加载器



i5>


org.springframework.context.annotation.AnnotatedBeanDefinitionReader#register 使用 i3.1 步生成的 bean 定义读取器注册配置类





image.png



四、Spring 是如何解决循环依赖的


======================================================================================



什么是循环依赖?



所谓的循环依赖就是 A 依赖 B,B 依赖 A,或者是 A 依赖 B,B 依赖 C,C 依赖 A





image.png



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.可能存在的问题:



IOC 容器在创建 Bean 的时候,按照顺序,先去实例化 instanceA。然后突然发现我的 instanceA 是依赖我 的 instanceB 的;



那么 IOC 容器接着去实例化 intanceB,那么在 intanceB 的时候发现依赖 instanceA。若容器不处理的话,那么 IOC 将无限的执行上述流程,直到内存异常程序奔溃.



3.解决方案:



当然,Spring 是不会让这种情况发生的。在容器发现 beanB 依赖于 beanA 时,容器会获取 beanA 对象的一个早期的引用(early reference),并把这个早期引用注入到 beanB 中,让 beanB 先完成


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


实例化。beanB 完成实例化,beanA 就可以获取到 beanB 的引用,beanA 随之完成实例化。这里大家可能不知道“早期引用”是什么意思,这里先别着急…





超详细的阿里字节 Spring 面试技术点总结(建议收藏)



五、Spring Aop 源码分析


===================================================================================



AOP 核心概念



1.横切关注点(对哪些方法进行切入)



对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点



2.切面(aspect,把原来糅杂在业务逻辑代码中的非业务代码抽取出来,把功能 相同的放在一个类中形成一个切面)



类是对物体特征的抽象,切面就是对横切关注点的抽象



3.连接点(joinpoint)(需要切入的点)



被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指 的就是被拦截到的方法,实际上连接点还可以是字段或者构造器



4.切入点(pointcut)



对连接点进行拦截的定义



5.通知(advice)



所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异 常、最终、环绕通知五类



6.目标对象



代理的目标对象



7.织入(weave)



将切面应用到目标对象并导致代理对象创建的过程



8.引入(introduction)



在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段





超详细的阿里字节 Spring 面试技术点总结(建议收藏)



六、Spring 事务源码解析


==================================================================================



事务概念解析



1.什么是事物?



事务是逻辑上的一组执行单元,要么都执行,要么都不执行.



2. 事物的特性(ACID)





超详细的阿里字节 Spring 面试技术点总结(建议收藏)


用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
凭借着这份Spring面试题,我拿到了阿里,字节跳动美团的offer