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

知名wordpress架构网站佛山网站建设no.1

知名wordpress架构网站,佛山网站建设no.1,wordpress太臃肿,石景山网站建设的大公司一、什么是 SpringBoot 自动装配?Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用…

一、什么是 SpringBoot 自动装配?

Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化

SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的 META-INF/spring.factories 文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。

没有 SpringBoot 情况下,如果需要引入外部依赖,需要手动依赖 jar 包。在SpringBoot 中,可以直接引入一个 starter 即可。如果想在项目中使用 json 依赖,直接在项目中引入对应的 starter 即可,引入之后,使用一些少量的注解和简单的配置就能使用引入的功能了。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId>
</dependency>

简单来说就是,引入依赖告诉 SpringBoot 要使用什么,SpringBoot 会通过注解和少量配置完成功能实现。

二、SpringBoot 的自动装配以及按需加载

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootDemo3Application {public static void main(String[] args) {SpringApplication.run(SpringBootDemo3Application.class, args);}}

SpringBoot 启动类上的注解 @SpringBootApplication ,可以看成是

@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类

@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制;

@ComponentScan:扫描被 @Component ( @Service, @Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean 的组合

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...
}

从名字中可以看出,@EnableAutoConfiguration 这个注解是自动装配的核心注解,但是其核心功能还是使用 AutoConfigurationImportSelector 加载自动装配类实现的,在下面的第16行代码可以看到,@Import 该类。

package org.springframework.boot.autoconfigure;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

AutoConfigurationImportSelector 的继承体系如下:

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {}public interface DeferredImportSelector extends ImportSelector {}public interface ImportSelector {String[] selectImports(AnnotationMetadata var1);
}

AutoConfigurationImportSelector 实现了接口 ImportSelector 中的 selectImports 方法,此方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IOC 容器中

public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}
}

此处的 getAutoConfigurationEntry() 方法负责加载自动配置类

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes = this.getAttributes(annotationMetadata);List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);configurations = this.removeDuplicates(configurations);Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);}
}

if (!this.isEnabled(annotationMetadata)) 判断自动装配是否打开。默认 spring.boot.enableautoconfiguration=true,可在application.properties 或 application.yml 中进行配置。

AnnotationAttributes attributes = this.getAttributes(annotationMetadata); 获取 @EnableAutoConfiguration 注解中的 exclude 和 excludeName ,取消这些内容的装配。

configurations = this.removeDuplicates(configurations); 获取需要自动装配的所有配置类 ,读取 META-INF/spring.factories 文件。

此时,所有的配置文件都被读取到,可以看到 configurations 的大小为148

可以看到这个文件的配置内容都被读取到了,不光是这个依赖下的 META-INF/spring.factories 被读取到,所有 Spring Boot Starter 下的 META-INF/spring.factories 都会被读取到

并不是所有配置在 SpringBoot 启动时都会加载,

此处 configurations 的大小变成了27,这一步经历了一遍筛选,完成按需加载。

http://www.dtcms.com/a/413966.html

相关文章:

  • 关于网站建设的合同范本正规可以做卷子的网站
  • 官网网站搭建需要多少钱产品推销方案
  • 做长图网站wordpress home index
  • 淘宝客网站开发网站开发毕业设计参考文献
  • 学做网站可以赚钱吗淘宝了做网站卖什么好
  • 音乐网站如何建设的网站建设客户资料收集清单
  • 网站成本费用青岛免费模板建站
  • 如何做伪原创文章网站制作一个购物网站要多少钱
  • 做网站域名的公司wordpress内页锚文本
  • 龙岗企业网站设计公司wordpress充值提现
  • 四川网站设计首选柚米科技怎么更改网站备案信息吗
  • 自助建站空间怎么用海口建站程序
  • 如何用公司名称搜到公司网站百度商城app
  • 先搭建网站还是先做ui网页游戏大全免费
  • 云主机网站的空间在哪里看网上商城前端模板
  • 广州网站制作网页昭通网站建设
  • 网站如何连接微信支付西安网络公司排名
  • 网站有做货培训教育网站建设
  • 浏览器如何做购物网站新零售网络推广方案
  • php网站 上传企业网站在线超市
  • 福清市住房和城乡建设局网站自己做网站制作需要多少钱
  • 郑州网站制作设计有限公司破产债务怎么办
  • python搭建网站网站建设需要哪些条件
  • 可以做早安图片的网站网络广告营销的典型案例
  • 建站之星快速建站价格wordpress 论坛 整合
  • 个人网站如何在工信部备案免费自助音乐网站申请
  • 剪辑培训seo发帖网站
  • 免费企业网站源码wordpress 写作
  • 网站建设需要哪些条件影院网站怎么做
  • 军事前沿最新消息流程优化的七个步骤