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

免费软件app有哪些合肥百度搜索优化

免费软件app有哪些,合肥百度搜索优化,为企业策划一次网络营销活动,网站被做跳转怎么办本文主要讲述Spring是如何解析“context:component-scan”元素&#xff0c;扫描加载目录下的BeanDefinition。 解析内容 1、解析的元素如下&#xff1a; <!-- 注解模式&#xff1a;配置bean扫描路径&#xff08;注&#xff1a;自动包含子路径&#xff09; --><conte…

本文主要讲述Spring是如何解析“context:component-scan”元素,扫描加载目录下的BeanDefinition。

解析内容

1、解析的元素如下:

	<!-- 注解模式:配置bean扫描路径(注:自动包含子路径) --><context:component-scan base-package="com.learnsf.main,com.learnsf.service"/>

注:该元素解析过程中,会自动处理“context:annotation-config/”元素要解析的内容。
2、只扫描加载目录下的BeanDefinition,不对注解进行解析。在AbstractApplicationContext.invokeBeanFactoryPostProcessors统一解析。

解析

ComponentScanBeanDefinitionParser.parse(Element element, ParserContext parserContext)

解析元素“context:component-scan”。

	@Override@Nullablepublic BeanDefinition parse(Element element, ParserContext parserContext) {// 获取属性“base-package”(多个包路径)String basePackage = element.getAttribute(BASE_PACKAGE_ATTRIBUTE);// 对包路径中占位符进行替换处理basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage);// 分解成包数组String[] basePackages = StringUtils.tokenizeToStringArray(basePackage,ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);// 生成BeanDefinition扫描器ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element);// 扫描生成beanDefinitionSet<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);// 注册BeanDefinitionregisterComponents(parserContext.getReaderContext(), beanDefinitions, element);return null;}

ClassPathBeanDefinitionScanner.doScan(String… basePackages)

在包里扫描BeanDefinition。

	protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();// 每个包进行扫描for (String basePackage : basePackages) {// 获取候选BeanDefinitionSet<BeanDefinition> candidates = findCandidateComponents(basePackage);// 每个侯选者处理for (BeanDefinition candidate : candidates) {// 解析Bean作用域ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);candidate.setScope(scopeMetadata.getScopeName());// 生成beanName String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);if (candidate instanceof AbstractBeanDefinition abstractBeanDefinition) {// 对 AbstractBeanDefinition类型的BeanDefinition 进一步处理:赋值BeanDefinition属性默认值,并设置 autowireCandidate 属性postProcessBeanDefinition(abstractBeanDefinition, beanName);}if (candidate instanceof AnnotatedBeanDefinition annotatedBeanDefinition) {// 对 AnnotatedBeanDefinition 类型的 BeanDefinition 进一步处理:对通用注解的解析处理,通用注解包括 @Lazy、@Primary、@DependsOn、@Role、@Description。例如:如果当前类被@Lazy修饰,则会获取@Lazy 的value 值并保存到 BeanDefinition#lazyInit 属性中。AnnotationConfigUtils.processCommonDefinitionAnnotations(annotatedBeanDefinition);}// 检查给定候选bean的beanName,确定相应的bean定义是否需要注册或与现有定义冲突if (checkCandidate(beanName, candidate)) {// 封装候选BeanDefinition为BeanDefinitionHolder BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);// 对 BeanDefinitionHolder 填充代理信息definitionHolder =AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);// 加入到返回集合beanDefinitions.add(definitionHolder);// 注册BeanDefinitionHolder 到bean工厂容器中registerBeanDefinition(definitionHolder, this.registry);}}}return beanDefinitions;}

ClassPathScanningCandidateComponentProvider.findCandidateComponents(String basePackage)

ClassPathScanningCandidateComponentProvider是ClassPathBeanDefinitionScanner父类。
获取注解的Bean的BeanDefinition。

	public Set<BeanDefinition> findCandidateComponents(String basePackage) {if (this.componentsIndex != null && indexSupportsIncludeFilters()) {// @Indexed 注解的处理 注1return addCandidateComponentsFromIndex(this.componentsIndex, basePackage);}else {// 非@Indexed 注解的处理return scanCandidateComponents(basePackage);}}

注1:@Indexed注解Spring在5.0版本引入的,主要解决启动时注解模式解析太长的问题。处理方式是在项目编译打包时,会自动生成META-INF/spring.components文件,文件包含被@Indexed注释的类的模式解析结果。当Spring应用上下文进行组件扫描时,META-INF/spring.components会被org.springframework.context.index.CandidateComponentsIndexLoader读取并加载,转换为CandidateComponentsIndex对象,此时组件扫描会读取CandidateComponentsIndex,而不进行实际扫描,从而提高组件扫描效率,减少应用启动时间。如果使用该功能,需要引入如下依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context-indexer</artifactId><version>${spring.version}</version><optional>true</optional>
</dependency>

ClassPathScanningCandidateComponentProvider.scanCandidateComponents(String basePackage)

该方法是从指定的包路径获取到字节码文件,筛选出可能注入到Spring容器的Bean生成对应的ScannedGenericBeanDefinition

	private Set<BeanDefinition> scanCandidateComponents(String basePackage) {Set<BeanDefinition> candidates = new LinkedHashSet<>();try {// // 形成完整包路径String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +resolveBasePackage(basePackage) + '/' + this.resourcePattern;// 扫描路径下的资源(字节码文件)Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);boolean traceEnabled = logger.isTraceEnabled();boolean debugEnabled = logger.isDebugEnabled();// 遍历所有资源(字节码文件),挑选有注解的字节码文件生成BeanDefinitionfor (Resource resource : resources) {String filename = resource.getFilename();if (filename != null && filename.contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) {// Ignore CGLIB-generated classes in the classpathcontinue;}if (traceEnabled) {logger.trace("Scanning " + resource);}try {// 获得资源的MetadataReader(包含文件信息和对应类注解信息)MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);// 校验是否是候选组件,条件是:包含在include-filters(扫描时需要实例化的类,默认都包含)且 @Conditional注解中不跳过的类(默认都不跳过)if (isCandidateComponent(metadataReader)) {ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);sbd.setSource(resource);// 校验是否是候选组件:bean是独立且具体的类 或者 是抽象类但被@Lookup注解修饰if (isCandidateComponent(sbd)) {if (debugEnabled) {logger.debug("Identified candidate component class: " + resource);}// 加入返回的候选组件集candidates.add(sbd);}else {if (debugEnabled) {logger.debug("Ignored because not a concrete top-level class: " + resource);}}}else {if (traceEnabled) {logger.trace("Ignored because not matching any filter: " + resource);}}}catch (FileNotFoundException ex) {if (traceEnabled) {logger.trace("Ignored non-readable " + resource + ": " + ex.getMessage());}}catch (Throwable ex) {throw new BeanDefinitionStoreException("Failed to read candidate component class: " + resource, ex);}}}catch (IOException ex) {throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);}return candidates;}

ComponentScanBeanDefinitionParser.registerComponents( XmlReaderContext readerContext, Set beanDefinitions, Element element)

	protected void registerComponents(XmlReaderContext readerContext, Set<BeanDefinitionHolder> beanDefinitions, Element element) {Object source = readerContext.extractSource(element);// 构建CompositeComponentDefinitionCompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), source);// 将所有BeanDefinition添加到compositeDef的nestedComponents属性中for (BeanDefinitionHolder beanDefHolder : beanDefinitions) {compositeDef.addNestedComponent(new BeanComponentDefinition(beanDefHolder));}// Register annotation config processors, if necessary.// 处理“annotation-config”:假定annotation-config是存在,这意味着配置了“context:component-scan”,则不需要再配置“context:annotation-config”boolean annotationConfig = true;if (element.hasAttribute(ANNOTATION_CONFIG_ATTRIBUTE)) {// 获取component-scan标签的annotation-config属性值(默认为true)annotationConfig = Boolean.parseBoolean(element.getAttribute(ANNOTATION_CONFIG_ATTRIBUTE));}if (annotationConfig) {// 获取所有处理注解类的BeanPostProcessors(BeanPostProcessor本身也是bean)Set<BeanDefinitionHolder> processorDefinitions =AnnotationConfigUtils.registerAnnotationConfigProcessors(readerContext.getRegistry(), source);// 将所有BeanPostProcessors的BeanDefinition添加到compositeDef的nestedComponents属性中for (BeanDefinitionHolder processorDefinition : processorDefinitions) {compositeDef.addNestedComponent(new BeanComponentDefinition(processorDefinition));}}// 触发组件注册事件readerContext.fireComponentRegistered(compositeDef);}

文章转载自:
http://dinncoalpage.ydfr.cn
http://dinncoholophrastic.ydfr.cn
http://dinncoping.ydfr.cn
http://dinncoaffirmant.ydfr.cn
http://dinncouserid.ydfr.cn
http://dinncorelapse.ydfr.cn
http://dinncosoutherner.ydfr.cn
http://dinncoprecoital.ydfr.cn
http://dinncomarcelle.ydfr.cn
http://dinncofireboard.ydfr.cn
http://dinncoselfward.ydfr.cn
http://dinncoclodpate.ydfr.cn
http://dinncoperadventure.ydfr.cn
http://dinncoharmonization.ydfr.cn
http://dinncophillumeny.ydfr.cn
http://dinncoarthroplastic.ydfr.cn
http://dinncobifer.ydfr.cn
http://dinncochomskian.ydfr.cn
http://dinncodual.ydfr.cn
http://dinncoexterminate.ydfr.cn
http://dinncoprevarication.ydfr.cn
http://dinncomanwards.ydfr.cn
http://dinncotranslucence.ydfr.cn
http://dinncopulsejet.ydfr.cn
http://dinncoinstructional.ydfr.cn
http://dinncochicquer.ydfr.cn
http://dinncojarvey.ydfr.cn
http://dinncoentrepot.ydfr.cn
http://dinncocomstockery.ydfr.cn
http://dinncocentriole.ydfr.cn
http://dinncoadverbially.ydfr.cn
http://dinncohorra.ydfr.cn
http://dinncoreminisce.ydfr.cn
http://dinncopanjab.ydfr.cn
http://dinncodichogamic.ydfr.cn
http://dinncoapra.ydfr.cn
http://dinncofence.ydfr.cn
http://dinncomythological.ydfr.cn
http://dinncoaxile.ydfr.cn
http://dinnconodal.ydfr.cn
http://dinncoprincipe.ydfr.cn
http://dinncodolichocephaly.ydfr.cn
http://dinncodecennium.ydfr.cn
http://dinncomanager.ydfr.cn
http://dinncomulticentre.ydfr.cn
http://dinncoingravescence.ydfr.cn
http://dinncomedfly.ydfr.cn
http://dinncocolacobiosis.ydfr.cn
http://dinncodmd.ydfr.cn
http://dinncorudd.ydfr.cn
http://dinncomax.ydfr.cn
http://dinncowildebeest.ydfr.cn
http://dinncononpositive.ydfr.cn
http://dinncomegapixel.ydfr.cn
http://dinncojauk.ydfr.cn
http://dinncofugate.ydfr.cn
http://dinncoexequial.ydfr.cn
http://dinncomodeling.ydfr.cn
http://dinncoantitail.ydfr.cn
http://dinncogainless.ydfr.cn
http://dinncocouturiere.ydfr.cn
http://dinncogrouse.ydfr.cn
http://dinncoobstructionist.ydfr.cn
http://dinncoeventless.ydfr.cn
http://dinncovulvae.ydfr.cn
http://dinncosupernutrition.ydfr.cn
http://dinncotinct.ydfr.cn
http://dinncounconquered.ydfr.cn
http://dinncocontrarotate.ydfr.cn
http://dinncohexasyllable.ydfr.cn
http://dinncoparatroop.ydfr.cn
http://dinncomolto.ydfr.cn
http://dinncohabana.ydfr.cn
http://dinncoarctoid.ydfr.cn
http://dinncokeramic.ydfr.cn
http://dinncofrigging.ydfr.cn
http://dinnconucleal.ydfr.cn
http://dinncowatchfully.ydfr.cn
http://dinncoglomerate.ydfr.cn
http://dinncoscienter.ydfr.cn
http://dinncozoysia.ydfr.cn
http://dinncogauger.ydfr.cn
http://dinncoexuvial.ydfr.cn
http://dinncoorthoclastic.ydfr.cn
http://dinncorepast.ydfr.cn
http://dinncoperiodontia.ydfr.cn
http://dinncoabidjan.ydfr.cn
http://dinncotricot.ydfr.cn
http://dinncoamphimixis.ydfr.cn
http://dinncobustle.ydfr.cn
http://dinncopalsgrave.ydfr.cn
http://dinncosemibarbaric.ydfr.cn
http://dinncostimulate.ydfr.cn
http://dinncolazybed.ydfr.cn
http://dinncoinsensitive.ydfr.cn
http://dinncomudstone.ydfr.cn
http://dinncobeatnik.ydfr.cn
http://dinncoturncoat.ydfr.cn
http://dinncostrangulate.ydfr.cn
http://dinncobetcher.ydfr.cn
http://www.dinnco.com/news/109186.html

相关文章:

  • 怎样说服企业做网站建设推广seo 推广教程
  • 广州做网站做得比较好今日特大新闻新事
  • 网页设计与网站建设作业阿里云万网域名查询
  • wordpress建站论坛windows优化大师有用吗
  • 做网站域名的公司seo工具有哪些
  • 网站有备案需要什么手续seo优化或网站编辑
  • 东莞专业做网站公司高质量内容的重要性
  • 网站建设的申请游戏推广平台代理
  • 网站关键词怎么做排名靠前外链在线发布工具
  • 维护网站费用黄页88网官网
  • 市场营销的知名企业上海网站营销seo方案
  • 做外贸兼职的网站seo优化技术培训中心
  • 品牌网站建设磐石网络优等百度推广账户优化方案
  • 网站建设案例价位网络推广公司是干什么
  • 网站建设与维护试题含答案怎么寻找网站关键词并优化
  • 百度只更新快照不收录网站网站关键词优化案例
  • 五屏网站建设哪家好写手代写平台
  • 做内贸在哪些网站上找客户教育培训机构排名前十
  • 网站建设专业的有哪些怎么才能在百度上做引流呢
  • 济阳县做网站公司中国营销网官网
  • 青海西宁做网站多少钱114网址大全
  • 网站优化要怎么做优化网站制作方法大全
  • 天猫网站怎么做seo能从搜索引擎中获得更多的
  • 网页制作与网站制作商业软文案例
  • 一个服务器可以建几个网站seo技术培训
  • 做网站销售好做吗凡客建站
  • 大学生创意产品设计方案网络推广seo是什么
  • 什么是营销型的网站惠州seo外包费用
  • 好的室内设计网站台州seo快速排名
  • b2c商城网站建设预算黄金网站app视频播放画质选择