图1
图1 new AnnotationConfigApplicationContext() 可以传配置类Appconfig.class,,也可以传普通bean对象,如图1-1 当传Appconfig.class配置类的时候会调用refresh()方法。传bean的时候不会调用。 refresh()方法是初始化我们容器的。
图2
图3
总结 图1到图4 为 :AnnotaionConfigApplicationConetext 指定spring的初始化环境,然后利用java 的config技术依赖Appconfig.class的配置类,扫描这个包的路径。
图1-1
图1-2
图4
图4 spring 初始化环境,通过图4 AnnotationConfigApplicationContext 传进javaconfig 类,或者bean 类。this() 的方法先调用父类构造器的方法然后再调用自己的构造方法 (图5)。
图5
图5初始化一个bean的读取和扫描器。读取器是 读取一个加了注解的BeanDefinitionReader。图6所示.
图6
图7
BeanDefinitionRegistry 是通过 AnnotationConfigApplicationContext 构造器传进来的,所以说AnnotationConfigApplicationContext是一个BeanDefinitaionRegistry的类。GencrcApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegitry 。BeanDefinitationRegistry为BeanDefinitation的注册器。 图8 ;那BeanDefinitation 是是什么?
图8
图9
图
图10
图10
图11
图9 到图11 说明BeanDefinitation 是对 spring bean 描述的,类似于Class。那为什么不直接用Class那,因为BeanDefinitation比Class多很多方法。所有spring 从新实现了一个类。在java中一切都是对象,那么描述对象的类就是Class ,那么在spring中都是bean ,描述bean的的类就是BeanDefinitation类型。
图12
图12进接图7
图13
图13 可以注册一个新添加的bean ,也可以注册一个 java配置类。
图14
图15
图16
图16注册单个bean
图17
BeanDefinitionCustomizer为自定义注解. beanDefinitionHolder 类似一个map key abd 一个bean的详细描述,value为 bean的name.
代理模式,需要和springMvc结合,后续详解。
图18
图20
图21
图22
this.beanFactory 指的就是 DefaultListableBeanFactory
图23
图23 注册过程就是把 beanName和beanDefinitaion注册到这个beanDefinitionMap中 。这里的this就是DefaultListableBeanFactory; 这个beanDefinitionMap就是容器。
图24
DeaaultListableBeanFactory 产生一个bean,那么这个bean的原料来自哪里? 来自于红线指向的那个方形为List<>beanDefinitaionNames 用来存bean的name,绿色为方形为容器beanDefinitionMap 里面包含,beanName,和bd。
图25
图25表示这个map容器中除了indexDao 还有6个实例。那么这6个实例是什么时候放进去的。是在图26 也就是是上面图12
图26
图27
图28
8
图28这个方法不重要.
图29
图29 获取系统环境。
图30
图30获取 上面的DeaaultListableBeanFactory 中包含 beanDefinitionMap 的类返回,给外部 赋值给外部的局部变量..不太重要。
图31
图31这个方法很重要。为DeaaultListableBeanFactory 这个设置一些标准的属性,例如ClassLoader,表达式,属性解析器,后置处理器等,其中最重要的是后置处理器, beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)) ,添加后置处理器。
图32
图33
图33 往beanPostProcessors List中添加了一个 后置处理器。
图34
图34 为 AppLicationContexAwareProcessor 与BeanPostProocessor的关系。
图35
图36
图37
图38
图36 ,图37 ,图38 自定义一个beanPostProcessor 的来插手bean的实例化。
图39
图39 beanPostProcesstor 继承PriorityOrdered 这个类,重写getOrder()方法,返回数值,值约小约优先执行。
图40
ApplicationContextAwareProcessor
ApplicaionContextAwareProcessor 有两个重要的方法一个postProcessBeforeInitialization().。一个是postPorocessAfterInitialization()。
图41
当我们需要在spring环境中每次从容器中获取不同的 bean对象的时候,例如scope是prototype 的对象时候,我们可以采用,图41的方法实现ApplicationContextAware 重写setApplicationContext()方法,在spring容器启动的时候就会调 在 添加后置处理器中 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)) ,new ApplicationContextAware()时,postProcessBeforeInitialization(). 这个方法 中 setApplicationContext()方法即重写得setApplicationContext()方法,把当前的applicationContext变量进行赋值,然后通过applicationContext每次获取最新的bean,即不会重复的bean.
图42
图43