您当前的位置:网站首页>鸭嘴鱼,割礼-娱乐圈不靠剧本而活的爱情,娱乐明星爱情

鸭嘴鱼,割礼-娱乐圈不靠剧本而活的爱情,娱乐明星爱情

2019-05-21 07:10:04 投稿作者:admin 围观人数:172 评论人数:0次

咱们知道 Spring Boot 能快速的建立起一个运用,简化了很多的装备进程,那到底有多”简”呢?

咱们经过一个比方来阐明,平常咱们经过 Spring 和 Spring MVC 建立一个 helloword 的 Web 运用,需求做以下作业:

  1. 装备 pom.xml 增加 Spring 、 Spring MVC 结构的依靠,一起还需求考虑这些不同的结构的不同版别是否存在不兼容的问题。
  2. 装备 Web.xml,加载 Spring、Spring MV李小龙女儿李香凝C。
  3. 装备 Spring 。
  4. 装备 Spring MVC。
  5. 编写事务逻辑代码。

而运用 Spring Boot 建立的话,需求做以下作业:

  1. 装备 pom.xml 承继 Spring Boot 的 pom.xml ,增加 Web 起步依靠。
  2. 创立发动引导类。
  3. 编写事务逻辑代码。

单从进程数量上看就知道经过 Spring、Spring MVC 建立比经过 Spring Boot 建立更杂乱,需求编写很多的装备,这还仅仅是在很少结构和 Spring 整合情况下,假如需求将多个第三方结构和 Spring 整合,恐怕就要堕入”装备阴间”了,此外这些装备根本都是固化的,也便是建立新的运用,你依然需求再次编写相同的装备信息,特别是在微服务这么火的当下,一个运用或许由十几个乃至几十个小型服务无组成,假如每个小型服务都重复的做着这些装备作业……。

那有没有什么办法处理这个局势呢?答案是有的,那便是运用 Sp鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情ring Boot ,上从上面的比方就能够发现,运用 Spring Boot 的最大长处便是减少了装备的作业,那么是不是说运用 Spring Boot 就不需求这些装备进程了?当然不是,而是 Spring Boot 帮咱们把这些作业给做了。

那 Spring Boot 是怎么帮咱们把这些装备作业给做了呢?这便是本文需求讨论的问题了,在讨论之前,咱们需求了解两个概念 起步依靠主动装备 ,这儿暂时知道这两个东西是 Spring Boot 的中心、是 Spring Boot 的精华地点、是咱们不需求再进行很多装备作业的原因地点就行了。

起步依靠

起步依靠说白了便是 Spring Boot 经过对常用的依靠进行再一次封装,例如咱们平常需求建立一个 Web 运用的时分,一般都会导入以下几个依靠:


org.springframework
spring-we降龙十八掌bmvc
5.1.3.RELEASE


org.springframework
spring-web
5.1.3.RELEASE

也便是需求将 spring-web 和 spring mvc 别离导入,而运用 Spring Boot 的话只需求导入一个:


org.springframework.boot
spring-boot-starter-web

也便是只需求导入一个名为 web 的起步依靠即可,咱们点 spring-boot-鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情starter-web 进去能够看到,其实这个起步依靠集成了常用的 web 依靠,如下:


org.springframework.boot
spring-boot-starter
2.1.4.RELEASE
compile


org.springframework.boot
spring-boot-starter-json
2.1.4.RELEASE
compile


org.springframework.boot
spring-boot-starter-tomcat
2.1.4.RELEASE
compile


org.hibernate.validator
hibernate-validator
6.0.16.Final
compile


o鼻癌rg.springframework
spring-web
5.1.6.RELEASE
compile


org.springframework
spring-webmvc
5.1.6.RELEASE
compile

也便是前面所说的,Spring Boot的起步依靠说白了便是对常用的依靠进行再一次封装,便利咱们引进,简化了 pom.xml 装备,可是更重要的是将依靠的办理交给了 Spring Boot,咱们无需重视不同的依靠的不同版别是否存在抵触的问题,Spring Boot 都帮咱们考虑好了,咱们拿来用即可!

在运用 Spring Boot 的起步依靠之前,咱们需求在 pom.xml 中增加装备:


org.springframework.boot
spring-boot-starter-parent
2.1.朗逸轿车4.RELEASE


即让 pom.xml 承继 Spring Boot 的 pom.xml ,而 Spring Boot 的 pom.xml 里边界说了常用的结构的依靠以及相应的版别号。

总结一下 Spring Boot 的起步依靠的长处:

  1. 无需考虑不同结构的不同版别的抵触问题。
  2. 简化了 pom.xml 装备。

主动装备

假如将开发一个运用比方成装饰房子的进程,那么 Spring Boot 就像是一个全能型公司相同存在,而起步依靠能够比方成购买装饰用品的进程,主动装备比方成用装饰用品进行装饰的进程。

咱们能够经过 Spring Boot 的起步依靠获取到你想要的涂料、瓷砖、装饰品等, Spring Boot 公司会依据最佳的组合将这些装饰用品打包好给咱们,咱们无需考虑各种装饰用品是否调配、是否抵触等问题。

经过起步依靠咱们获取到了想要的装饰用品,那接下来咱们需求做的便是进行装饰了,前面咱们说过 Spring Boot 就像一个全能型公司相同,所以咱们在他那里购买装饰用品之后, 他不只将装饰用品送上门还会帮咱们完结装饰(主动装备) ,让咱们享用一站式的服务,从购买装饰品(起步依靠)到装饰完结(主动装备)都不必咱们考虑,咱们只需求在装饰完结之后入住(编写自己的事务逻辑代码)即可。

说了这么多,咱们还不知道 Spring Boot 是怎么完结主动装备的,接下来咱们来剖析 Spring Boot 奇特的主动装备!

首要咱们知道 Spring Boot 发动需求有一个发动引导类,这个类除了是运用的进口之外,还发挥着装备的 Spring Boot 的重要效果。下面是一个简略的发动引导类:

@SpringBootApplication
public class DemoAppl道德6080ication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

咱们发现有一个名为 @SpringBootApplication 的注解,点击进去能够发现,这个注解发挥着多个注解的效果:利市光电

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@Compo施寂摩nentScan(
excludeFilters = {@Filtlunaer(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)

这儿扼要的说下 @SpringBootConfiguration 和 @ComponentScan 注解。前者本质为 @Configuration 注解,这个注解比较咱们都触摸过,也便是起到声明这个类为装备类的效果,而后者起到敞开主动扫描组件的效果。

这儿需求要点剖析的是 @EnableAutoConfiguration 这个注解,这个注解的效果是敞开 Spring Boot 的主动装备功用,咱们来剖析一下它是怎么敞开的,点击进去能够看到:

@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 {};
}

@EnableAutoConfiguration 这个生物注解相同发挥着多个注解的功用,咱们要点剖析 @Import({AutoConfigurationImportSelector.class}) 这个注解,咱们知道 @import 的效果是将组件增加到 Spring 容器中,而在这儿便是将 AutoConfigurationImportSelector 这个组件增加到 Spring 容器中。

咱们进一步剖析 AutoConfigurationImportSelector

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.remove鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情All(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}

有一个名为 getAutoConfigurationEntry 的办法,这个办法发挥的效果是扫描 ClassPath 下的一切 jar 包的 spring.facto申世京ries 文件,将 spring.factories 文件 key 为 EnableAutoConfiguration 的一切值取出,然后这些值其实是类的全限定名, 也便是主动装备类的全限定名 ,然后 Spring Boot 经过这些全限定名进行类加载(反射),将这些主动装备类增加到 Spring 容器中。

那这些主动装备类有哪些?发挥什么效果呢?咱们接着往下看,咱们找到一个名为 spring-boot-autoconfigure-2.1.4.RELEASE.jar 的 jar 包,翻开它的 spring.factories 文件,发现这个文件有 key 为 EnableAutoConfiguration 的键值对

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfigurati导数公式on,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
......

也便是这个 jar 包有主动装备类,能够发现这些主动装备配都是以 xxxAutoConfiguration 的命名规矩来取名的,这些主动装备类包括我了们常用的结构的主动装备类,比方 aop 、 elasticsearch 、 redis 和 web 等等,根本能满意咱们日常开发的需求。

那这些主动装备类又是怎么发挥装备效果的呢,咱们取一个较为简略的装备类进行剖析,名为 HttpEncodingAutoConfiguration ,它的部分代码如下:

@Configuration //声明这个类为装备类
@EnetableConfigurationProperties({HttpProperties.class}) //敞开ConfigurationProperties功用,一起将装备文件和HttpProperties.class绑定起来
@ConditionalOnWebApplication( //只要在web运用下主动装备类才收效
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class}) //只要存在CharacterEncodingFilter.class情况下 主动装备类才收效
@ConditionalOnProperty( //判别装备文件是否存在某个装备spring.http.encoding,假如存在其值为enabled才收效,假如不存在这个装备类也收效。
prefix = "spring.http.encoding",
value = {"enabled"},
分量换算matchIfMissing = true
)
//将字符编码过滤器组件增加到 Spring 容器中
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
攻沙玲珑塔走法filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpPropercomicdownties.Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
return filter;
}
@Bean
public HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer(this.properties);
}

首要它相同有许多注解,咱们一个一个剖析:

  • Configuration:这个注解声明晰这个类为装备类(和咱们平常写的装备类相同,相同是在类上加这个注解)。
  • EnableConfigurationProperties:敞开 ConfigurationProperties 功用,也便是将装备文件和 HttpProperties.class 这个类绑定起来,将装备文件的相应的值和 HttpProperties.class 的变量相关起来,能够点击 HttpProperties.class 进去看看,下面截取了部分代码进行剖析:
@ConfigurationPropert饥饿小丑ies(
prefix = "spring.http"
)
public static final Charset DEFAULT_CHARSET;
private Charset charset;
private 光纤Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
private Map mapping;

经过 C鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情onfigurationP鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情roperties 指定前缀,将装备文件 application.p鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情roperties 前缀为 spring.http 的值和 HttpProperties.class 的变量相关起来,经过类的变量能够发现,咱们能够设置的特点是 charset 、 force 、 forceRequest 、 forceResponse 和 mapping 。也便是咱们除了运用 Spring Boot 默许供给的装备信息之外,咱们还能够经过装备文件指定装备信息。

CharacterEncodingFilter

能够发现后边几个注解都是 ConditionalXXXX 的命名规矩,这些注解是 Spring 拟定的条件注解,只要在契合条件的情况下主动装备类才会收效。

接下来的 characterEncodingFilter 办法,创立一个 CharacterEncodingFilter 的目标,也便是字符编码过滤器,一起设置相关特点,然后将目标回来,经过 @Bean 注解,将回来的目标增加到 Spring 容器中。这样字符编码过滤器组件装备好了,而平常的话,咱们需求在 web.xml 进行如下装备:


springUtf8Encoding
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8


forceEncoding
true



springUtf8Encoding
/*

到这儿是不是感触到了 Spring Boot 主动装备带来的好处了?

接下来的鸭嘴鱼,割礼-文娱圈不靠剧本而活的爱情,文娱明星爱情 localeCharsetMappingsCustomizer 办法同理,就不剖析了。

最终咱们用一句话总结一下 Spring Boot 的主动装备:Spring Boot 发动的时分,会扫描 ClassPath 下的一切 jar 包,将其 spring.factories 文件中 key 为 EnableAutoConfiguration 的一切值取出,然后这些值其实是类的全限定名, 也便是主动装备类的全限定名 ,然后 Spring Boot 经过这些全限定名进行类加载(反射),将这些主动装备类增加到 Spring 容器中。这些主动装备类依据不同的条件(@ConditionalXXX)决议主动装备类是否收效,收效的话主动装备类会将相关组件增加到 Spring 容器中,也就不必咱们再进行装备!

总结

看了网上挺多的文章都说的不是很清楚,所以依照自己的了解写下了这篇总结,有误之处欢迎指出。

欢迎作业一到五年的Java工程师朋友们参加Java程序员开发: 721575865

群内供给免费的Java架构学习材料(里边有高可用、高并发、高功能及分布式、Jvm功能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构材料)合理使用自己每一分每一秒的时刻来学习斑提高自己,不要再用"没有时刻“来粉饰自己思想上的懒散!趁年青,用力拼,给未来的自己一个告知!

the end
娱乐圈不靠剧本而活的爱情,娱乐明星爱情