【已迁移到Github不再维护】Spring系列总结

构件

BeanDefinition:Class只描述了类的信息,而BeanDefinition描述了对象的信息,如:@Scope、@Lazy、@DependsOn;

  • Spring在启动的时候需要「扫描」在XML/注解/JavaConfig 中需要被Spring管理的Bean信息
  • beanDefinitionMap中存,key是beanName,value是BeanDefinition对象

BeanFactoryPostProcessor:遍历beanDefinitionMap,执行BeanFactoryPostProcessor这个工厂后置处理器的逻辑;

  • 可以对bean元信息修改
  • 修改占位符最常用的场景就是数据源配置,一般我们会在配置中写这样的代码:<property name="driverClassName"value="${jdbc.driverClassName}" />这里的${jdbc.driverClassName}就是占位符,实际的value来源于项目的配置文件,实际运行代码的时候会把这里的占位符替换成配置的实际值,这里就是BeanFactoryPostProcessor来完成替换的,你也可以根据自己的需要来定制BeanFactoryPostProcessor

  • 不要在这个方法里面实例化bean

BeanFactory:首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混

  • BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂,我们熟悉的ApplicationContext就是一个BeanFactory;
  • FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。

FactoryBean:FactoryBean 通常是用来创建比较复杂的bean,一般的bean 直接用xml配置即可,但如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean。

- 很多开源项目在集成Spring 时都使用到FactoryBean,比如 MyBatis3 提供 mybatis-spring项目中的 org.mybatis.spring.SqlSessionFactoryBean:

- FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利

xxxAware:容器里面的对象分两种,一种是用户自定义对象,一种是容器对象,Aware 接口可以理解为用来获取某些容器对象的方法。

  • 获取容器对象肯定是为了想利用容器对象的能力/服务 通过实现某种类型的Aware 来将自定义对象与容器"攀上亲"
  • 例如一个普通的Bean对象,需要用到BeanFactory 
  • BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

BeanPostProcessor:主要是用作给bean获取一些动态数据,或者启动动态任务的,BeanPostProcessor后置处理器有两个方法,一个是before,一个是after(那肯定是before先执行、after后执行)

  • BeanPostProcessor是所有bean初始化之后才执行的
  • 这个BeanPostProcessor后置处理器是AOP实现的关键(关键子类AnnotationAwareAspectJAutoProxyCreator)
  • BeanPostProcessor相关子类的before方法执行完,则执行init相关的方法,包括@PostConstruct、InitializingBean接口等
  • InitializingBean与init-method

DisposableBean:释放资源,做关闭操作,方法:destroy-method

画一个图,参考知乎

循环依赖

  简单过程:首先A对象实例化,然后对属性进行注入,发现依赖B对象,B对象此时还没创建出来,所以转头去实例化B对象,B对象实例化之后,发现需要依赖A对象,那A对象已经实例化了,所以B对象最终能完成创建,B对象返回到A对象的属性注入的方法上,A对象最终完成创建

  三级缓存:分别为:singletonObjects(正式对象)、earlySingletonObjects(半成品)、singletonFactories(工厂),key是BeanName,Value是ObjectFactory

为什么需要三级?

  三级考虑代理,二级考虑性能

问答

spring 中都用到了哪些设计模式?  

spring 中有哪些核心模块?  

说一下你理解的 IOC 是什么?  

spring 中的 IOC 容器有哪些?有什么区别?  

那 BeanFactory 和 FactoryBean 又有什么区别?  

@Repository、@Service、@Compent、@Controller它们有什么区别?  

那么 DI 又是什么?  

说说 AOP 是什么?  

动态代理和静态代理有什么区别?  

JDK 动态代理和 CGLIB 代理有什么区别?  

Spring AOP 和 AspectJ AOP 有什么区别?  

spring 中 Bean 的生命周期是怎样的?  

spring 是怎么解决循环依赖的?  

为什么要使用三级缓存,二级缓存不能解决吗?  

@Autowired 和 @Resource 有什么区别?  

spring 事务隔离级别有哪些?  

spring 事务的传播机制有哪些?  

springBoot 自动装配原理?

posted @ 2018-01-14 23:37  饭小胖  阅读(228)  评论(0编辑  收藏  举报