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

微信手机版登录入口seo优化教程培训

微信手机版登录入口,seo优化教程培训,网页无法访问如何解决360浏览器,深圳疫情新闻发布会直播在理解springboot自动装配之前需要了解spring的Configuration原理和Conditional两个注解原理。可以看下以前写的这两篇文章 spring 源码阅读之Configuration解析 spring使用Conditional进行条件装配 spring的SPI机制之使用SpringFactoriesLoader加载服务实现 SpringBootApp…

在理解springboot自动装配之前需要了解spring的@Configuration原理和@Conditional两个注解原理。可以看下以前写的这两篇文章

spring 源码阅读之@Configuration解析

spring使用@Conditional进行条件装配

spring的SPI机制之使用SpringFactoriesLoader加载服务实现

@SpringBootApplication注解

一切的开始要从SpringBootApplication注解开始,来看下SpringBootApplication注解定义

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

1、@SpringBootConfiguration注解用来标识当前是一个@Configuration配置类

2、@ComponentScan指定exclude,主要是跳过即有@Configuration注解又有@EnableAutoConfiguration注解的类。先不加载。

3、@EnableAutoConfiguration开启自动装配,引入AutoConfigurationImportSelector类,AutoConfigurationImportSelector是一个ImportSelector。

前面的文章说@Configuration注解的时候,注解spring容器默认会有一个ConfigurationClassPostProcessor处理器,这个是registery后置处理器,在bean扫描完后,根据已经获取的bean进行可能的扩展beanDef加载。

ConfigurationClassPostProcessor后置方法会拿出所有的@Configuration类型的bean然后逐一使用ConfigurationClassParser进行解析,然后在处理@Import的时候如果是ImportSelector会调用其selectImports()方法来进行扩展beanDef的加载。

@SpringBootApplication引入@EnableAutoConfiguration注解,然后引入@AutoConfigurationImportSelector注解,其selectImports方法调用getAutoConfigurationEntry()方法来解析自动配置。

AutoConfigurationImportSelector#selectImports

public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);//获取候选的配置类List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);//configurations一系列过滤处理configurations = removeDuplicates(configurations);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);//@Condition条件过滤,最后剩下需要加载的confiurationconfigurations = getConfigurationClassFilter().filter(configurations);//创建AutoConfigurationImport事件fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
}

这里看到首先通过getCandidateConfigurations() 获取候选的config类,会通过SpringFactoriesLoader来读取配置。

SpringFactoriesLoader前面说过,可以理解成对java SPI的一种扩展,只不过约定配置文件是META-INF/spring.factories。

SpringFactoriesLoader#loadSpringFactories

private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {Map<String, List<String>> result = cache.get(classLoader);if (result != null) {return result;}result = new HashMap<>();//加载classpath下的所有配置文件Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);//读取配置文件内容Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();//value多个用英文逗号相隔,解析成数组String[] factoryImplementationNames =StringUtils.commaDelimitedListToStringArray((String) entry.getValue());for (String factoryImplementationName : factoryImplementationNames) {result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>()).add(factoryImplementationName.trim());}}}// Replace all lists with unmodifiable lists containing unique elementsresult.replaceAll((factoryType, implementations) -> implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)));cache.put(classLoader, result);return result;
}

这里变量FACTORIES_RESOURCE_LOCATION=“META-INF/spring.factories”。spring.factories文件是一个properties文件,key value形式来标识配置类。多个value用英文逗号相隔。这里解析的是所有的配置,不仅仅是autoconfiguration类型的,所有解析完成会存放到cache后面多次使用,最后还会根据key=org.springframework.boot.autoconfigure.EnableAutoConfiguration从map中获取所有的configuration。

来看下spring-boot.jar中的配置样例:

# Logging Systems
org.springframework.boot.logging.LoggingSystemFactory=\
org.springframework.boot.logging.logback.LogbackLoggingSystem.Factory,\
org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.Factory,\
org.springframework.boot.logging.java.JavaLoggingSystem.Factory# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
...

获取到所有的autoconfiguration类后会进行一系列的过滤,主要一步是

getConfigurationClassFilter().filter(configurations)。这一步会对configuration进行条件过滤,这里就使用了spring的@Conditional来进行条件装配,只不过springboot对其进行了扩展了很多注解。

来看几个例子:

RabbitAutoConfiguration

@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration

RedisAutoConfiguration

@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration 

JdbcTemplateAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
@Import({ DatabaseInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class,NamedParameterJdbcTemplateConfiguration.class })
public class JdbcTemplateAutoConfiguration {}

上面几个例子使用的@ConditionalOnClass就是当classpath中有对应的类时才会加载该类,这样经过过滤后就是满足条件的configurations来进行加载。

比如上面的JdbcTemplateAutoConfiguration,满足条件就会引入JdbcTemplateConfiguration,这个类里为我们自动装配好一个JdbcTemplate实例bean,所以在业务代码需要使用jdbcTemplate的直接注入就可以。

class JdbcTemplateConfiguration {@Bean@PrimaryJdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);JdbcProperties.Template template = properties.getTemplate();jdbcTemplate.setFetchSize(template.getFetchSize());jdbcTemplate.setMaxRows(template.getMaxRows());if (template.getQueryTimeout() != null) {jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());}return jdbcTemplate;}}
http://www.hkea.cn/news/955231/

相关文章:

  • 发布自己的做家教的网站网店运营推广登录入口
  • b s网站系统如何做性能测试百度推广运营怎么做
  • 洛阳seo外包公司费用seo的中文意思
  • 政府网站建设遵循的原则seo网站内容优化
  • java做网站具体步骤邵阳seo优化
  • 自己做的网站如何放进服务器今天今日头条新闻
  • 男装网站的网站建设背景惠州seo按天计费
  • 如何快速提高网站排名互联网项目推广
  • icp备案网站名称更改成都网站设计
  • 企业网站建设需求分析seo排名资源
  • python基础教程雪峰东莞搜索seo网站关键词优化
  • b2b网站开发供应商小程序开发教程全集免费
  • 用自己的手机做网站外链网站是什么
  • 市场调研公司介绍网站推广优化公司
  • 玉溪人民政府网站建设现状新网站seo
  • 湖南餐饮网站建设2023北京封控了
  • 重庆网站设计人员外贸网站搭建推广
  • 局域网内的网站建设西安网站建设公司排名
  • 普通网站报价多少中南建设集团有限公司
  • 蚌埠做网站哪家好全网营销国际系统
  • 沈阳市网站制作谷歌香港google搜索引擎入口
  • 做美食网站的背景高端网站建设制作
  • 文件什么上传到wordpress泉州seo技术
  • 网站地址地图怎么做网页制作的软件有哪些
  • 如何用万网建设网站口碑营销策划方案
  • 做网站的基础架构东莞seo建站公司
  • 嘉兴做网站的哪家好龙岗网站制作
  • 论坛做网站好吗百度官方网页
  • 微信开发者工具获取系统日期seo优化一般包括
  • 怎么用文本做网站百度排行榜风云榜