Spring IOC AOP相关知识点

  • 面试时源码讲到的程度,每步做什么事情。比如 bean 实例化经过哪些过程、什么时候填充属性;
  • 注解是只个标记,生效的是注解解析器,注解的含义是通过解析器来实现的;
  • 一级缓存存的是已实例化和初始化完成的完成品对象,初始化完成指对象中的属性已赋值;
  • 二级缓存和三级缓存存的是已实例化,但未初始化的对象,即对象的属性未赋值;
  • 二级缓存与三级缓存区别,二级缓存存的是(半成品)对象的代理引用,三级缓存存的是(半成品)对象的引用;
  • 需要做扩展时才会从三级缓存放到二级缓存,不做扩展时,当对象的属性都赋值完成,从半成品变为完成品时,会从三级缓存到一级缓存;
  • 到 P7 、P8 才会问循环依赖的问题;
  • 动态代理可以嵌套执行,即将代理对象中为参数,为其创建新的代理对象,调用 invoke 方法;
  • Spring Bean 定义,执行了后置处理器,走完整个 refresh() 流程,完成实例化和初始化的;
  • 自定义注解,使用反射实现;
  • ThreadLocal,使用副本空间来保证线程安全性;
    1. Thread 有个重要属性为 ThreadLocalMap,该 map 存储当前线程的变量;
    2. 每个线程 Thread 都有各自的 ThreadLocalMap;
    3. 存取变量时,先获取当前线程的 ThreadLocalMap,存储到该线程的 map。
  • SpringMVC 为单独功能,也包含容器,为 webApplicationContext,可脱离 Spring 单独运行。整合时会有两个容器,Spring 的容器为 ApplicationContext,SpringMVC 的容器为 webApplicationContext;
  • ConfigurationClassPostProcessor 为后置处理器,可解析多个注解,比如 componentScan、bean、propertySource;
  • AuwoiredAnnotationBeanPostProcessor 为后置处理器,解析 autowired;
    1. 在 postProcessProperties 方法中,会调用 metaData.inject 方法;
    2. @Autowired 标注在属性上,执行 field.set() 进行注入;
    3. @Autowired 标注在方法上,执行 method.invoke() 进行注入;
  • ConfigurationClassPostProcessor 和 AuwoiredAnnotationBeanPostProcessor 很重要,需熟悉;
  • context.getBeanDefinitionNames(),可获取容器内注入了哪些对象;
  • 异步处理,会为当前对象创建代理对象,是在后置处理中执行的,不是在三级缓存的流程中,即没法使用三级缓存,所以不能处理循环依赖;
  • idea 不推荐在 Field 上使用 @Autowired,而是推荐在 setter 方法上(另一个没听清);
  • Spring 优雅的设计;
    1. 最典型的是模块化。完成 AOP 添加 AOP 的 jar 包,每个功能为一个模块;
    2. 接口单一职责原则,每个接口只负责单一功能实现;
    3. 接口隔离,不同接口不同功能。通过后缀可知该类的功能,比如 xxfactory 为工厂类,xxhandler 为处理器;
  • Spring 的 Bean 生命周期有多个接口调用,某个接口不实现,则跳过;
  • Spring 扫描,ClassPathScanningCandidateComponentProvider#scanCandidateComponents;
    1. 扫描所有 classes,获取所有 Resource 资源;
    2. 遍历 Resource,获取元数据 metadataReader;
    3. 解析,看是否有 @@ComponentScan,定义 ScannedGenericBeanDefinition;
    4. 返回 BeanDefinition,后面会完成 BeanDefinition 的注册,注册到容器中。
  • Spring 的后置处理器,实际生产环境没应用;
  • Spring AOP 可实现项目里多数据源动态切换功能,拦截后使用 if 条件判断;
  • 自动装配的局限性,指向不明。@Autowired 默认按类型指定,@Qualifier 按名字指定,可配合 @Qualifier 执行;
  • Spring 不支持分布式,可加上 EJB 分布式技术。SpringCloud 可完成分布式;
  • 注解和 xml 都配置了,名字相同,后一个对象会覆盖前一个。在 DefaultListableBeanFactory 类中的属性 allowBeanDefinitionOverriding=true,即默认会覆盖;
  • Sprint 条件注解,只有一个 @Condition。 SpringBoot 会在其基础上写 @ConditionOnClass,后续 SpringBoot 课程说明;
  • Spring 编程式事务,try{} catch{},try 提交事务,异常回滚事务,对代码侵入性高;
  • Spring 的设计模式,单例(getSingleton)、工厂(BeanFactory)、策略(资源类 Resource,有不同子类实现对不同请求的调用,比如 xml 文件调用 xml 的 Resource,url 调用 url 的 Resource)、装饰(xxHolder)、代理、适配器;
  • 跳大厂的必备条件;
    1. 基础牢靠,原理理解,比如数据结构、NIO 这些;
    2. 实际经验丰富,高并发、线程池经验、性能瓶颈的优化;
  • cglib 动态代理的实现原理,基于继承的方式, super 父类方法来实现;
  • 大厂使用 Spring 框架,搭配主流框架。传统为 SSM,分布式为 SpringBoot + SpringCloud;
  • Spring 没法管理 Servlet,其初始化流程由 Tomcat 负责;
  • Spring 启动只有一个线程,但操作访问 Spring,比如创建对象时会有多个线程,所以使用 ConcurrentHashMap;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时小浅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值