当前位置: 首页 > news >正文

备案网站名称更改/seo一个月赚多少钱

备案网站名称更改,seo一个月赚多少钱,搜索引擎网站有哪些,知名的企业网站建设接上篇&#xff1a;bean定义加载整体流程&#xff1a;https://blog.csdn.net/matt8/article/details/106352083 看下非默认标签的解析过程&#xff0c;以<context:annotation-config/>这个标签为例。 非默认标签的解析&#xff0c;是通过org.springframework.beans.fac…

接上篇:bean定义加载整体流程:https://blog.csdn.net/matt8/article/details/106352083

看下非默认标签的解析过程,以<context:annotation-config/>这个标签为例。

非默认标签的解析,是通过org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element)这个方法实现的,这个方法直接调用的自己的parseCustomElement(ele, null)这个方法,源码如下:

	public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {//获取非默认标签Namespace,这里是http://www.springframework.org/schema/contextString namespaceUri = getNamespaceURI(ele);//获取解析非默认标签的处理器,在每个jar包的META-INF/spring.handlers这个文件里有命名空间和处理器类的对应关系,通过这种方式,我们也可以自定义标签NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);if (handler == null) {error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);return null;}//标签解析return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));}

这里的处理器拿到的是ContextNamespaceHandler处理器,标签解析调用的是它的父类的方法org.springframework.beans.factory.xml.NamespaceHandlerSupport#parse,源码如下:

public BeanDefinition parse(Element element, ParserContext parserContext) {return findParserForElement(element, parserContext).parse(element, parserContext);}	

这里会先查找解析器,解析器是在创建处理器对象时初始化进去的,也就是ContextNamespaceHandler处理器的init()方法设置的,这里的findParserForElement()方法会根据名字拿到对应的解析器,名字就是annotation-config,得到的解析器对象是AnnotationConfigBeanDefinitionParser解析器,最终的解析工作是这个解析器完成的。

看下解析的代码,org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser#parse方法:

	@Overridepublic BeanDefinition parse(Element element, ParserContext parserContext) {Object source = parserContext.extractSource(element);//这里将注册获取到所有相关BeanPostProcessors的bean定义Set<BeanDefinitionHolder> processorDefinitions =AnnotationConfigUtils.registerAnnotationConfigProcessors(parserContext.getRegistry(), source);// Register component for the surrounding <context:annotation-config> element.CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);parserContext.pushContainingComponent(compDefinition);// Nest the concrete beans in the surrounding component.for (BeanDefinitionHolder processorDefinition : processorDefinitions) {parserContext.registerComponent(new BeanComponentDefinition(processorDefinition));}// Finally register the composite component.parserContext.popAndRegisterContainingComponent();return null;}

主要看下AnnotationConfigUtils.registerAnnotationConfigProcessors()方法,源码如下:

	public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source) {DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);if (beanFactory != null) {if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);}if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());}}Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);//注册ConfigurationClassPostProcessor后置处理器,对应 @Configurationif (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}//注册AutowiredAnnotationBeanPostProcessor后置处理器,对应 @AutoWiredif (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}//注册RequiredAnnotationBeanPostProcessor后置处理器,对应 @Requiredif (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}// spring还支持基于JSR-250的注解,注册CommonAnnotationBeanPostProcessor后置处理器,其中包括@PostConstruct,@PreDestroy和@Resource注解if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));}//JPA中的注解,注册PersistenceAnnotationBeanPostProcessor后置处理器,对应 @PersistenceContext 这里是不支持的if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition();try {def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,AnnotationConfigUtils.class.getClassLoader()));}catch (ClassNotFoundException ex) {throw new IllegalStateException("Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);}def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));}//注册EventListenerMethodProcessor后置处理器,对应 @EventListenerif (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));}return beanDefs;}

<context:annotation-config/>这个标签的解析就完成了。

这里要注意:<context:annotation-config />仅能够在已经在已经注册过的bean上面起作用,对于没有在spring容器中注册的bean,它并不能执行任何操作。

http://www.lbrq.cn/news/1044037.html

相关文章:

  • 建设金融网站/全国疫情最新消息今天新增
  • c语言开发网站后端/世界杯排名
  • 凡科建网站怎么做阴影立体/可以免费打开网站的软件
  • 网站建设方案及报价单/qq群引流推广平台
  • wordpress分页太丑/厦门seo哪家强
  • 长沙网站排名技术/长春seo优化
  • 做网站用哪个eclipse/百度广告电话号码是多少
  • 南昌优易科 网站建设/山东疫情最新消息
  • 地推网/莱芜seo
  • 杭州论坛网/二十条优化措施全文
  • 各类专业网站建设/最近的电脑培训学校
  • 珠海网站建设有限公司/网站设计报价方案
  • 美国淘宝代购网站建设/郑州厉害的seo顾问公司
  • 网站建设 源代码归属/搜索优化的培训免费咨询
  • 房产证/网站seo排名培训
  • 广东同江医院网站建设/2023免费推广入口
  • 网站源码下载了属于侵权吗/百度推广登陆入口
  • 腾讯网站站内面包屑导航/厦门网站推广优化哪家好
  • wordpress 动态网站/自己怎么做引流推广
  • 在哪里做卖车网站/每日财经要闻
  • 网站建设快照优化/淘宝运营培训机构
  • 微信公众号网站导航怎么做/专业做网站官网
  • 在网站中写小说想要删除如何做/网站引流推广怎么做
  • 谷歌seo网站运营/陕西省人民政府
  • 怎么用java做html5网站/seo外贸公司推广
  • 不错的网站建设/合肥百度快速排名优化
  • 冠县网站开发/seo如何优化
  • 群晖 wordpress 迁移/新站优化案例
  • 收到网站建设账务处理/个人如何加入百度推广
  • 网站当前位置怎么做/做网站seo推广公司
  • CompletableFuture实现Excel 多个sheet页批量导出
  • 2025年TOP5服装类跟单软件推荐榜单
  • 202506 电子学会青少年等级考试机器人一级理论综合真题
  • [Oracle] MAX()和MIN()函数
  • 【深度学习新浪潮】近三年3DGS在大规模场景重建中的研究进展(2022-2025)
  • Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具