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

镇江品牌网站建设关键词优化难度查询

镇江品牌网站建设,关键词优化难度查询,如何选择网站托管公司,制作网站可以赚钱吗文章目录 前言一、导入普通类二、导入ImportSelector实现类三、导入ImportBeanDefinitionRegistrar实现类四、Import注解的解析4.1、解析实现ImportSelector的候选bean4.2、解析实现ImportBeanDefinitionRegistrar的候选bean4.3、DeferredImportSelector的特殊处理 总结 前言 I…

文章目录

  • 前言
  • 一、导入普通类
  • 二、导入ImportSelector实现类
  • 三、导入ImportBeanDefinitionRegistrar实现类
  • 四、@Import注解的解析
    • 4.1、解析实现ImportSelector的候选bean
    • 4.2、解析实现ImportBeanDefinitionRegistrar的候选bean
    • 4.3、DeferredImportSelector的特殊处理
  • 总结


前言

  @Import是Spring框架提供的一个核心注解,主要用于在配置类中引入其他配置类或组件。通过在类上标注@Import注解,可以将其value属性中指定的类注册到Spring容器中,从而实现配置的模块化和灵活组合。

一、导入普通类

  @Import注解会将其中导入的普通类,注册成bean放入到Spring容器中。

public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);System.out.println(context.getBean(MyService.class));}
}class MyService {
}@Configuration
@Import(MyService.class) 
class Config {}

  运行结果:

com.itbaima.importdemo.demo1.MyService@55183b20

二、导入ImportSelector实现类

  解析@Import注解时会执行实现了ImportSelector的类的selectImports方法,将返回的数组中的类注册成bean。

public class Demo2 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config1.class);System.out.println(context.getBean(MyService.class));}
}@Configuration
@Import(MyImport.class)
class Config1{}class MyImport implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.itbaima.importdemo.demo1.MyService"};}
}

  运行结果

com.itbaima.importdemo.demo1.MyService@33d512c1

三、导入ImportBeanDefinitionRegistrar实现类

  实现了ImportBeanDefinitionRegistrar的类,可以自己注册bean定义,以及从已有的bean定义中获取指定的bean,进行修改,自由度是最高的。

public class Demo3 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);System.out.println(context.getBean("orderService"));}
}@Configuration
@Import({MyBeanDefinitionRegistrar.class})
class Config {
}class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {GenericBeanDefinition bd = new GenericBeanDefinition();bd.setBeanClass(MyService.class);registry.registerBeanDefinition("orderService", bd);}
}class MyService {
}

  运行结果:

com.itbaima.importdemo.demo2.MyService@2f9f7dcf

四、@Import注解的解析

  @Import注解的解析,体现在refresh方法中的invokeBeanFactoryPostProcessors(调用所有bean工厂后置处理器)这一步:
在这里插入图片描述
  ConfigurationClassPostProcessor,用于配置类的解析:
在这里插入图片描述
  在org.springframework.context.annotation.ConfigurationClassParserprocessImports中完成对于@Import注解的解析:
在这里插入图片描述

4.1、解析实现ImportSelector的候选bean

  对于候选bean实现了ImportSelector接口的处理:

  1. 利用JVM的类加载机制,对于候选bean进行加载。
  2. 使用Spring提供的工具方法instantiateClass反射创建这个ImportSelector实例,并注入必要的环境参数。
  3. 如果候选bean实现了DeferredImportSelector,则将其加入deferredImportSelectors的集合中,延迟处理
  4. 候选bean实现的是ImportSelector接口,就调用目标类重写的selectImports方法,决定要导入哪些类名。然后把类名数组转换成 SourceClass 的集合,并应用排除过滤器。

在这里插入图片描述
  调用目标类重写的selectImports方法,传入的参数就是加入了@Configuration注解的配置类的元信息。最后一步递归调用processImports方法很关键:假设当前第一次调用processImports方法,解析出的类路径是com.itbaima.importdemo.demo1.MyService,那么在递归调用processImports方法时,再次进入
在这里插入图片描述
  循环中进行解析时,由于MyService没有实现ImportSelectorImportBeanDefinitionRegistrar注解,就会进入最后的else分支:(@Import导入的普通bean,进入的也是该分支)
在这里插入图片描述
  在最后的else分支中,还会去递归调用processConfigurationClass,将MyService当做配置类去解析,最终将解析完成的放入到ConfigurationClass的集合中。(注意,通过Import解析出的类路径下的bean,bean名称为空,后续需要再次进行处理。)
在这里插入图片描述
  this.reader.loadBeanDefinitions(configClasses);这一步,会对于@Import导入的普通bean进行处理:
在这里插入图片描述
  生成一个beanName,并且将bean定义注册到bean工厂中:
在这里插入图片描述

4.2、解析实现ImportBeanDefinitionRegistrar的候选bean

  @Import导入实现ImportBeanDefinitionRegistrar的候选bean的解析逻辑,在else…if的分支中,同样是通过JVM的类加载机制,加载候选类的class类,然后使用Spring提供的工具方法instantiateClass反射创建这个ImportBeanDefinitionRegistrar实例,并注入必要的环境参数。
在这里插入图片描述
  最后将其加入到ConfigurationClassimportBeanDefinitionRegistrars属性中:
在这里插入图片描述
  它的解析同样是在processConfigBeanDefinitionsthis.reader.loadBeanDefinitions(configClasses);中:
在这里插入图片描述
  回调用户重写的registerBeanDefinitions的逻辑。
在这里插入图片描述

4.3、DeferredImportSelector的特殊处理

  用户实现ImportSelector时,有一种特殊的情况,即用户实现了DeferredImportSelectorDeferredImportSelectorImportSelector的子类。在该分支中,仅仅是先将其加入DeferredImportSelectorHandlerdeferredImportSelectors属性中:
在这里插入图片描述
  DeferredImportSelectorHandlerdeferredImportSelectors属性是一个集合:
在这里插入图片描述
  最终会在所有bean解析完成后再去进行解析:
在这里插入图片描述
  该机制主要应用于Spring Boot的自动配置场景,其核心作用是确保用户自定义的Bean能够优先于自动配置的Bean执行。由于spring.factories中定义的自动配置Bean通常采用条件装配机制,当容器中已存在用户自定义的同类型Bean时,系统将不再重复装配。这正是通过@Bean注解添加的Bean能够覆盖默认Bean的原因
在这里插入图片描述
在这里插入图片描述
  在doProcessConfigurationClass中,默认的@Bean的注解,是后于@Import注解解析的。如果你不显式允许覆盖,Spring 在注册 BeanDefinition 时会抛出异常或者忽略重复的注册。
在这里插入图片描述
  但是对于DeferredImportSelector的解析,是在doProcessConfigurationClass的外层parse方法中执行的,后于@Bean注解的解析。

总结

  @Import注解是为了替换掉配置文件中的import标签,主要是为了导入第三方的配置类,除此之外:

  1. 可以在配置类中指定@Import注解,将其中的类注入到容器中。
  2. 可以在配置类中指定@Import注解,同时其中的类实现了Import Selector接口,会执行重写的selectImports方法,并且将其中指定的路径的对象注入到容器中。
  3. 如果导入的类型实现了Import BeanDefinitionRegistrar,则可以自己注册 BeanDefinition,自由度更高。

http://www.dtcms.com/wzjs/495204.html

相关文章:

  • 怎么样让客户做网站和小程序百度关键词排名怎么靠前
  • wordpress基础主题站seo算法优化
  • 网络平台都有哪些搜索引擎优化的基本手段
  • 网站宽度百度q3财报2022
  • 网站病毒视频百度官网平台
  • 外贸网站建设wordpress长沙seo培训
  • 淄博桓台学校网站建设哪家好站外推广方式有哪些
  • 做网站起什么名字比较好佛山网站优化排名推广
  • 网站建设放在哪个费用如何做百度关键词推广
  • asp.net做电商网站设计郑州百度推广外包
  • 公司内部网站建设的意义网络推广员一个月多少钱
  • 一个网站的基调seo公司软件
  • 新手建站1 网站建设过程一览百度推广效果怎样
  • asp网站怎么验证到百度站长新网域名
  • 一般网站怎么做推广东莞网站建设方案外包
  • 中国志愿者服务网站登录注册百度提交入口地址在哪
  • 360推广助手百度刷排名seo
  • vue webpack 做网站青岛网站制作
  • 想搞网站建设广东省最新新闻
  • 威联通nas 做网站重庆网站页面优化
  • 合肥公司网站建设价格seo外链工具
  • 网站建立吸引人的策划活动目前较好的crm系统
  • 武威网站建设seo的优点
  • 网站圣诞问候特效南昌seo全网营销
  • 网站seo解决方案信息流广告投放工作内容
  • 瑞安建设网站广告优化师工作内容
  • 找哪个网站做摩配合肥网站排名
  • 国外有哪些网站做推广的比较好天津搜狗seo推广
  • 河南外贸网站制作广州seo公司官网
  • 重庆公司核名在哪个网站淘宝交易指数换算工具