spring学习总结

applicationContent load加载流程学习
  1. 理解applicationContent创建流程
  2. 对于xml的加载与验证
  3. bean的注册
  4. AbstractApplicationContext.refresh是上下文加载的核心流程。

    @Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}




对beanFactory,applicationContext的扩展
  1. aware察觉到,意识到
  2. 在init化前后的spring bean,有接口BeanPostProcessor,postProcessBeforeIntialization,postProcess
    AfterIntialization
  3. 激活自定义init方法,实现InitializingBean接口,afterPropertiesSet方法将在init filed后执行。
  4. init-method,afterPropertiesSet都是在bean初始化后执行,afterPropertiesSet先,init-method后执行。
obtainFreshBeanFactory() 获得最新的BeanFactory
  1. 正式的实现BeanFactory,创建了一个DefaultListableBeanFactory。
  2. customizeBeanFactory()定义对BeanFactory的扩展,是否允许覆盖同名称的不同定义对象。是否允许bean的循环依赖。 对@Qualifier,@Autowired的解释
  3. 初始化DocumentReader,对xml进行解析验证
  4. loadBeanDefinitions()方法加载bean的定义,创建XmlBeanDeinitionReader解析器,用来读取xml。
prepareBeanFactory 方法的目的
  1. 主要对beanFactory提供扩展。
  2. 支持spel语音的支持。
  3. 增加对bean熟悉注入的类型转换编辑器,ResourceEditorRegistar。主要bean属性的转换注入
  4. 增加一些内置类,设置依赖注入可图略的接口
  5. 一些固定依赖
  6. 添加classLoader
applicationContextAwareProcessor 处理器
  1. 它实现的是BeanPostProcessor接口
  2. applicationContextAwareProcessor主要实现对特殊EnvironmentAware,ApplicationEventPulisherAware,ApplicationContentAware的对appContext的注入。
  3. 表示Aware不是普通的bean
BeanFactoryPostProcessor
  1. 在IOC 容器实际实例化任何bean之前读取配置元信息,并可以修改它,PropertyPlaceholderConfigurer 典型应用。
  2. beanFactory作为spring中容器功能的基础。用于存放已加载的bean。还提供上面扩展功能
BeanPostProcessor
  1. registerBeanPostProcessor的init
  2. 分类处理ProrityOrdered,Ordered,及无需的PostProcessors的分类处理。
  3. BeanPostProcessor的postProcessAfterInitialization
  4. 在KafkaListenerAnnotationBeanPostProcessor的postProcessAfterInitialization实现的bean的check实践,检查是否bean方法上是否添加kafkaListener注解。然后通过反射来调用。
init ApplicationEventMulticaster spring的事件处理器
  1. 典型的观察者模式实践,在initApplicationEvent,及registerListers方法。
  2. 提供executor为默认的并发执行器。
初始化非延迟加载单例
  1. finishBeanFactoryInit实现了初始化非延迟加载单例的工作
ConversionService
  1. 实现converter接口对输入,输出值进行转换。
  2. 注册到ConversionServiceFactoryBean。
finishRefresh 对Lifecycle接口的初始化
  1. Lifecycle接口提供start,stop方法在spring生命周期的前后执行,比如MQ的轮询器,以前实践的kafka-consumer就采用了。
  2. 依赖LifecycleProcessor处理器管理,finishRefresh提供对其init化。
问题总结
  1. beanFactory与FactoryBean的区别?
  • 以Factory结尾,表示它是一个工厂类(接口),负责生产与管理bean工厂,spring核心组件,提供xml解析,验证,及bean实例化前后processor处理。
  • BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。
  • http://www.cnblogs.com/aspirant/p/9082858.html
  • 一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean的形式
  • kafkaFactory就是FactoryBean。FactoryBean可以理解为自定义构建bean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值