Spring5.x 中容器启动源码怎么写


今天就跟大家聊聊有关 Spring5.x 中容器启动源码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring 已经是十分成熟的一个框架,此篇为开天辟地的Spring源码分析首发。读源码本来就是一件十分枯燥,具有一定难度,技巧性的有重要意义的事。万事开头难,我会利用空余时间持续的跟进文章的连载。对于喜爱源码的小伙伴,能够提供一定的帮助。最简单的启动spring的代码如下:AnnotationConfigApplicationContext先来看一下AnnotationConfigApplicationContext类的UML图,留个印象。点开AnnotationConfigApplicationContext(AppConfig.class);方法查看源码:该构造器允许我们传入一个或者多个class对象。class对象可以是被@Configuration标注的,也可以是一个普通的Java 类。有参构造器调用了无参构造器,点开源码:初始化子类时会先初始化父类,会默认调用父类无参构造器。AnnotationConfigApplicationContext继承了GenericApplicationContext,在GenericApplicationContext的无参构造器中,创建了BeanFactory的具体实现类DefaultListableBeanFactory。spring中的BeanFactory就是在这里被实例化的,并且使用DefaultListableBeanFactory做的BeanFactory的默认实现。DefaultListableBeanFactoryAnnotationConfigApplicationContext的构造器中还创建了两个对象:AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。ClassPathBeanDefinitionScanner scanner先说scanner的作用,通过查看源码可以发现,这个scanner只有在手动调用AnnotationConfigApplicationContext的一些方法的时候才会被使用(通过后面的源码探究也可以发现,spring并不是使用这个scanner来扫描包获取Bean的)创建AnnotatedBeanDefinitionReader对象。spring在创建reader的时候把this当做了参数传给了构造器。也就是说,reader对象里面包含了一个this对象,也就是AnnotationConfigApplicationContext对象。AnnotationConfigApplicationContext 实现了BeanDefinitionRegistry接口。点开this.reader = new AnnotatedBeanDefinitionReader(this);源码:从传入的BeanDefinitionRegistry对象,也就是AnnotationConfigApplicationContext对象中获取Environment(共用同一个Environment),然后又接着调用另一个构造器。点开源码:在这个构造器中,执行了一个非常重要的方法AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); 顾名思义,spring通过这个方法注册了解析注解配置相关的处理器。点开源码:第一步:设置属性注册的是一些spring内置的PostProcessor的BeanDefinition2.1、 ConfigurationClassPostProcessorConfigurationClassPostProcessor是一个BeanFactoryPostProcessor和BeanDefinitionRegistryPostProce 香港云主机ssor处理器,BeanDefinitionRegistryPostProcessor的处理方法能处理@Configuration等注解。ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry()方法内部处理@Configuration,@Import,@ImportResource和类内部的@Bean。ConfigurationClassPostProcessor类继承了BeanDefinitionRegistryPostProcessor。BeanDefinitionRegistryPostProcessor类继承了BeanFactoryPostProcessor。通过BeanDefinitionRegistryPostProcessor可以创建一个特别后置处理器来将BeanDefinition添加到BeanDefinitionRegistry中。它和BeanPostProcessor不同,BeanPostProcessor只是在Bean初始化的时候有个钩子让我们加入一些自定义操作;而BeanDefinitionRegistryPostProcessor可以让我们在BeanDefinition中添加一些自定义操作。在Mybatis与Spring的整合中,就利用到了BeanDefinitionRegistryPostProcessor来对Mapper的BeanDefinition进行了后置的自定义处理。2.2、AutowiredAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessor是用来处理@Autowired注解和@Value注解的2.3、RequiredAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor这是用来处理@Required注解2.4、CommonAnnotationBeanPostProcessor提供对JSR-250规范注解的支持@javax.annotation.Resource、@javax.annotation.PostConstruct和@javax.annotation.PreDestroy等的支持。2.5、EventListenerMethodProcessorEventListenerMethodProcessor提供@PersistenceContext的支持。EventListenerMethodProcessor提供@ EventListener 的支持。@ EventListener实在spring4.2之后出现的,可以在一个Bean的方法上使用@EventListener注解来自动注册一个ApplicationListener。我们发现:内部定义的class都是带internal的 beanDefs”>1、该方法从传入的BeanDefinitionRegistry对象,也就是AnnotationConfigApplicationContext对象中获取到DefaultListableBeanFactory对象。2、为获取的DefaultListableBeanFactory对象设置属性3、往DefaultListableBeanFactory对象中注册BeanDefinition,注册的是一些spring内置的PostProcessor的BeanDefinition(关于BeanDefinition的介绍下期在讲)。注意,此时只是注册BeanDefinition,并没有实例化bean。默认情况下,执行完该方法后,spring容器中所注册的BeanDefinition为:definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);ROLE_INFRASTRUCTURE = 2 就是我这Bean是Spring自己的,和你用户没有一毛钱关系所谓的注册BeanDefinition,简单理解就是将BeanDefinition放到DefaultListableBeanFactory.registerBeanDefinition对象的beanDefinitionMap中到此为止:DefaultListableBeanFactory.beanDefinitionMap 只有默认的spring beanDefinition====下面是大家熟悉的注册默认6大后置处理器:====1.ConfigurationClassPostProcessor2.AutowiredAnnotationBeanPostProcessor3.CommonAnnotationBeanPostProcessor4.Jpa的PersistenceAnnotationProcessor(没导包就不会注册)5.EventListenerMethodProcessor6.DefaultEventListenerFactory下一步只关心最后一个构造函数的registerDefaultFilters();方法Thiswillimplicitlyregisterallannotationsthathavethe
*{@linkComponent@Component}meta-annotationincludingthe
*{@linkRepository@Repository},{@linkService@Service},and
*{@linkController@Controller}stereotypeannotations.
*AlsosupportsJavaEE6’s{@linkjavax.annotation.ManagedBean}and
*JSR-330’s{@linkjavax.inject.Named}annotations,ifavailable.
*
*/
@SuppressWarnings(“unchecked”)
protectedvoidregisterDefaultFilters(){
this.includeFilters.add(newAnnotationTypeFilter(Component.class));
ClassLoadercl=ClassPathScanningCandidateComponentProvider.class.getClassLoader();
try{
this.includeFilters.add(newAnnotationTypeFilter(
((ClassextendsAnnotation>)ClassUtils.forName(“javax.annotation.ManagedBean”,cl)),false));
logger.trace(“JSR-250’javax.annotation.ManagedBean’foundandsupportedforcomponentscanning”);
}
catch(ClassNotFoundExceptionex){
//JSR-2501.1API(asincludedinJavaEE6)notavailable-simplyskip.
}
try{
this.includeFilters.add(newAnnotationTypeFilter(
((ClassextendsAnnotation>)ClassUtils.forName(“javax.inject.Named”,cl)),false));
logger.trace(“JSR-330’javax.inject.Named’annotationfoundandsupportedforcomponentscanning”);
}
catch(ClassNotFoundExceptionex){
//JSR-330APInotavailable-simplyskip.
}
}扫描过滤器includeFilters与excludeFilters首先这里的includeFilters大家熟悉吗,还有个excludeFilters,先看一下属性这里提前往includeFilters里面添加需要扫描的特定注解1.添加元注解@Component,需要注意的是@Repository、@Service、@Controller里面都标注了@Component。很好理解,扫描的时候用includeFilters 去过滤时,会找到并处理这4个注解的类。2.下面两个注解@ManagedBean、@Named需要有对应的jar包,否则(也就是说把这个方法走完),includeFilters里面只会有一个元素this.reader = new AnnotatedBeanDefinitionReader(this); 完成了spring内部BeanDefinition的注册(主要是后置处理器)1、beanDefinitionMap存放了所有的Defintion 以 key-value2、List beanDefinitionNames 存放了所有的beanDefintion名字this.scanner = new ClassPathBeanDefinitionScanner(this);1、这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法2、提供了includeFilters 和 excludeFilters 这里是一个扩展点看完上述内容,你们对 Spring5.x 中容器启动源码怎么写有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注开发云行业资讯频道,感谢大家的支持。

相关推荐: redis实现订单系统分库分表的索引表

这篇文章主要介绍“redis实现订单系统分库分表的索引表”,在日常操作中,相信很多人在redis实现订单系统分库分表的索引表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis实现订单系统分库分表的索引表”的疑惑有所帮助!接…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/11 09:16
下一篇 08/11 09:16

相关推荐