Spring Boot————简介与Spring时代的承接

引言

最近,公司正在开发一个景区系统的项目,涉及到Spring Boot框架的使用,在此记录下Spring Boot框架应该知道的基础知识。

一、产生

SpringBoot是顺应现在微服务(MicroServices)理念而产生的一个微框架(同类还有Dropwizard),用来构建基于Spring框架的标准化的独立部署应用程序。

二、SpringBoot快速开始:

我们使用Maven构建项目,所以新建一个maven项目, pom.xml中添加如下两个关键因素:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.2.5.RELEASE</version>
</parent>
...
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

使用spring-boot-starter-parent作为当前项目的parent可以享受到spring boot应用相关的一系列依赖(dependency), 插件(plugins)等装备, 而添加spring-boot-starter-web这个依赖,则纯粹是我们希望构建一个独立运行的web应用而已(注意, 没有version元素定义,因为spring-boot-starter-parent已经提供了相应的dependencyManagement)。有了以上配置,我们就可以按照SpringMVC的套路添加相应的Controller实现就可以了。

要让Spring Boot可以独立运行和部署,我们需要一个Main方法入口。

三、Spring Boot如何工作

3.1 Spring 特性回顾

3.1.1 XML配置与JavaConfig的选择问题

SpringBoot倡导基于JavaConfig的形式来“装配”应用, 但有些层面,我们还是希望根据公司的生态圈和基础设施现状,对其进行一些定制,以便更好的融入并享受一系列生态,而大部分要集成外部已有系统的时候, 通过xml集中明确化配置我认为是比较合适的做法。

总之, 这两种方式不应该是东风压倒西风,而应该根据情况来选择。 从我的角度来讲,我希望在SpringBoot里,除了Main入口类和autoscan相关的地方使用JavaConfig, 其它最好以xml配置。

3.1.2 @Configuration注解

@Configuration这个注解就是JavaConfig的典型代表。标注了这个注解的Java类定义,会以Java代码的形式(对应于xml定义的形式)提供一系列的bean定义和实例。 结合AnnotationConfigApplicationContext自动扫描的功能,就可以构建一个基于Spring容器的Java应用。

一系列标注了@Configuration的Java类的集合,对应于“昨日”的一系列xml配置文件。

3.1.3 @ComponentScan注解

@ComponentScan对应xml时代的<context:component-scan>。用来扫描classpath下标注了相应注解的Bean定义,然后加载到Spring容器中。

一般配合@Configuration注解来使用,你可以将@Configuraiton做的事情是纯手工定义bean然后添加到Spring容器, 而@ComponentScan则是自动收集bean定义并添加到Spring容器。

3.1.4 @Import注解

Spring容器的配置可以分散在多个物理存在的配置类或者配置文件中。

@Import允许将其它JavaConfig形式的配置类引入到当前的@Configuration标注的配置类当中, 对应于原来xml时代的<import/>, 甚至于也可以通过@ImportResource将xml形式定义的配置也引入当前JavaConfig形式的配置类当中。

3.1.5 @PropertySource注解

配合@Configuration使用, 用来加载.properties内容到Environment,比如:@PropertySource("classpath:/application.properties"),并需要容器中配置一个PropertySourcesPlaceholderConfigurer。

@PropertySource和@PropertySources的区别在于, 后者属于前者的Aggregation类型, 在有多个.properties资源需要引入的情况下,如果能够使用Java8的repeatable annotation特性,则只需要声明多个@PropertySource就行了, 否则,作为fallback方案,使用@PropertySources然后再其中引用多个@PropertySource好了。

3.1.6 Environment和Profile

这两个概念应该是Spring3时代引入的, Environment用来统一表达当前应用程序运行环境的概念,会以Properties的形式提供一系列该环境下的上下文信息,而且允许当前应用程序获取activeProfile是哪个。
说实话,Environment的设计,我觉得到提供上下文信息这一关键职能就可以了, 而Profile的设计,则有些太过于Monolithic时代的做事风格。 Profile一般用来提供某些灵活性, 但这种灵活性是内部化的, 这意味着, 你的软件实体需要知道外面可能提供多少种profiles, 然后在不同的profile下,我的软件实体需要做什么样的调整。 而实际上, 软件实体从研发到交付和使用, 最好是在整条流水线上设计和生产都是一致, 只有“销售”之前,才根据目标环境或者目标客户调整“包装”和配置, 然后“发货”, 用户拿到手的产品(当然包括我们搞的软件产品)应该是开箱即用的, 这个产品既不会存在我不需要的功能,也不应该每次使用的时候先自己“很智能”的扫描一下上下文环境然后决定使用哪一个Profile。尤其是在微服务时代,随着你服务数量的增长, 服务数量 * Environment数量 * 所谓的Profile数量更是指数级增长 3, 如果应用开发的时候还要考虑这么多,那出问题的几率就更大了。
所以, 在Microservices时代,我们更建议外部化你的软件产品差异化配置管理, 尽量减少Profile的滥用甚至不用(这就减少一个纬度的管理)。

3.2 对@EnableAutoConfiguration的理解

在本文之前提到的所有Annotation都属于SpringFramework提供的, 现在要说的这个Annotation,即@EnableAutoConfiguration, 则属于SpringBoot。
@EnableAutoConfiguration的定义信息如下:

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@Import(value={org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.class,org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class})
public @interface EnableAutoConfiguration

标注了这个Annotation的配置类将触发一系列动作, 也是SpringBoot“黑魔法”的核心, 魔法大体上是这样发生的: SpringBoot一旦发现@EnableAutoConfiguration, 那么就使用Spring框架提供的SpringFactoriesLoader这个特性去扫描当前应用classpath下所有META-INF/spring.factories元信息配置, 然后根据当前使用场景需要, 加载符合当前场景需要的配置类型并供当前或者后继流程使用, 对于@EnableAutoConfiguration的场景,就是提取以org.springframework.boot.autoconfigure.EnableAutoConfiguration作为key标志的一系列Java配置类,然后将这些Java配置类中的bean定义加载或者说灌入Spring容器中。
当然, EnableAutoConfiguration通过SpringFactoriesLoader筛选并加载进来的这些Java配置类里面,我们其实还可以进一步对要加载到容器的bean定义进行筛选, 这就会用Spring3系列引入的@Conditional“军团”, 通过像@ConditionalOnClass, @ConditionalOnMissingBean等具体的类型和条件来进一步决定加载还是不加载哪些bean定义。

3.3 Enter Main

有了上面的这些“前戏”, 下面我们正式进入正题了...
每一个SpringBoot应用都有一个入口类,在其中定义main方法, 然后使用SpringApplication这个类来加载指定配置并运行SpringBoot应用程序, 在很多SpringBoot的介绍中,都会使用当前入口类既作为配置(标注@Configuration)又作为入口类, 比如我们的HellSpringBoot:

@SpringBootApplication
public class HelloSpringBoot {public static void main(String[] args) throws Exception {SpringApplication.run(HelloSpringBoot.class, args);}
}

@SpringBootApplication等效于@Configuraiton + @EnableAutoConfiguration + @ComponentScan, 所以, 当我们将HelloSpringBoot.class作为JavaConfig配置类传入SpringApplication.run方法之后, SpringApplication.run方法就知道从哪里加载并扫描必要的bean定义了。
现在,剩下的就是要搞清楚SpringApplication.run里面发生了什么。

鸣谢

《Spring Boot Rock’n’Roll》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机考试400,400作文:电脑考试

400作文&#xff1a;电脑考试今天下午第三节课是大家最爱的电脑课&#xff0c;第三节课的上课铃还没敲响&#xff0c;大家就早早来到电脑室门口&#xff0c;拍好整齐的队伍&#xff0c;等待电脑金老师来带领我们进电脑室。终于&#xff0c;金老师面带微笑从办公室走到了我们这边…

史上最容易理解的暴力递归和动态规划~~

史上最容易理解的暴力递归和动态规划~~介绍递归和动态规划暴力递归&#xff1a;1&#xff0c; 把问题转化为规模缩小了的同类问题的子问题2&#xff0c; 有明确的不需要继续进行递归的条件(base case)3&#xff0c; 有当得到了子问题的结果之后的决策过程 4&#xff0c; 不记录…

英雄联盟与人生奋斗的类比讨论

自从去年毕业之后就已经很少玩英雄联盟了&#xff0c;最近半年更是一次都没碰过这个游戏了。 更新还是异常的频繁&#xff0c;打斗还是异常的激烈&#xff0c;比赛还是异常的水&#xff08;S系列中国队的表现&#xff09;。 我今天并不是想追忆曾经的激情&#xff0c;而是想把…

如何最好手机硬件测试软件,手机硬件出现故障?简单几部教你自己动手检测! _手机资讯...

很多人在使用手机时&#xff0c;经常遇到例如屏幕触摸不准、距离感应器不反应、手机按键失灵等类似问题&#xff0c;有的情况是系统故障&#xff0c;但大多数是属于硬件故障&#xff0c;那如何判定呢&#xff1f;其实很多安卓手机自带的有硬件检测工具&#xff0c;下面就以小米…

String StringBuilder StringBuffer三者之间的区别~~~

String StringBuilder StringBuffer三者之间的区别~~~String是字符串常量&#xff0c;它是典型的immutable类&#xff0c;被声明final class&#xff0c;所有的属性都是final&#xff0c;由于它的不变性&#xff0c;类似拼接&#xff0c;剪裁字符串等操作&#xff0c;都会产生…

qq传输文件的软件测试点,超强新功能 QQ传文件夹测试版抢先试用

QQ传文件夹测试版试用(1)中关村在线软件事业部消息 腾讯体验中心今日(7月29日)发布了一个新的体验项目“QQ2009传文件夹测试版”。QQ的传文件功能&#xff0c;相信多数用户都使用过。在之前的版本中&#xff0c;很多用户反馈希望增加传文件夹的功能&#xff0c;方便多文件的传输…

String String.valueof() toString三者之间的区别~

String String.valueof() toString三者之间的区别~&#xff08;String &#xff09;强制类型转换&#xff0c;使用这种方法时&#xff0c;需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查&#xff0c;以判断是否可以转换。否则容易抛出CalssCastExc…

SpringBoot学习——@Autowired自动注入报:could not be found问题的理解和解决方案

微服务应用程序中&#xff0c;我们会通过Java后台的方式发送http请求并调用其他注册在Spring Cloud Eureka server上的微服务&#xff0c;之前我们可能会手动封装一个Http发送请求类&#xff0c;然后通过其中的sendGet或者sendPost方法借由java IO的形式发送出去。 但是&#…

黑色玫瑰服务器延迟高,LOL:含金量最高的服务器,黑色玫瑰垫底,最后一个钻石起步!...

原标题&#xff1a;LOL&#xff1a;含金量最高的服务器&#xff0c;黑色玫瑰垫底&#xff0c;最后一个钻石起步&#xff01;黑色玫瑰。它是英雄联盟中非常特别的一个大区。这个大区是中间位置&#xff0c;电十&#xff0c;却是比电二高手还要多的地方。因为这个大区小姐姐特别的…

redis学习与入门~~~

redis学习与入门~~~ 一。 Redis 简介&#xff1a; 通常而言目前的数据库分类有几种&#xff0c;包括 SQL/NSQL,&#xff0c;关系数据库&#xff0c;键值数据库等等&#xff0c;分类的标准也不1&#xff0c;Redis本质上也是一种键值数据库的&#xff0c;但它在保持键值数据库简单…

Java网络编程————UDP实现ThinkPad S5网络唤醒

功能要求&#xff1a;通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识&#xff1a; 一、定义&#xff1a;网络唤醒&#xff0c;通过局域网、互联网或通讯网络&#xff0c;以有线网卡的形式&#xff0c;向目标电脑发送魔法包(Magic Packet)&#xff0c;让电脑自动开机。…

FFmpeg在Ubuntu的安装以及教程~~~

FFmpeg在Ubuntu的安装以及教程~~~一、安装 可通过PPA进行安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update sudo apt-get install ffmpeg 查看是否安装成功&#xff1a; ffmpeg -version二、相关概念比特率比特率&#xff0c;是一个决定音视…

Java学习指导————如何做到基础扎实

原文出处&#xff1a;《一篇文章教会你&#xff0c;如何做到招聘要求中的“要有扎实的Java基础”》 引言 不少同学总会产生这样的疑问&#xff1a; “请问&#xff0c;如何才叫基础扎实&#xff1f;” 答案是&#xff1a;“玩好JDK&#xff01;” JDK学习内容主要包含三部分…

奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容

《奥特曼系列ol》这款游戏中的怪兽图鉴也是很多玩家非常关注的问题之一哦&#xff0c;随着游戏的不断的更新&#xff0c;游戏也是加入了不少全新的玩法&#xff0c;一定让很多玩家觉得有些迷惑吧。下面小编为大家带来《奥特曼系列ol》怪兽图鉴以及怪兽阵容&#xff0c;希望大家…

继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

通过动态分配地址来提升javaweb文件下载接口的其兼容性和可扩展性&#xff1a; &#xff08;上篇博文地址&#xff1a;https://blog.csdn.net/weixin_37766296/article/details/80044000&#xff09;log4j.properties 文件&#xff1a; log4j.rootLogger debug,stdout,D,Elog4…

服务器主机启动不显示,服务器主机不启动怎么回事

服务器主机不启动怎么回事 内容精选换一换本文介绍了主机迁移服务SMS各特性版本的功能发布和对应的文档动态&#xff0c;新特性将在各个区域(Region)陆续发布&#xff0c;欢迎体验。源端服务器数据收集声明。源端服务器上安装和配置完迁移Agent后&#xff0c;迁移Agent会把源端…

Swagger自动接口文档生成框架————springboot整合swagger总结

swagger简介&#xff1a; swagger是一款开源的api接口文档生成工具。 Swagger的项目主页&#xff1a;https://swagger.io/ 目前比较流行的做法是在代码中加入swagger相关的注释&#xff0c;然后&#xff0c;利用小工具生成swagger.json或者swagger.yaml文件。 springboot…

申请 Let's Encrypt 数字证书,并安装cerbot快速上手教程~~

申请 Lets Encrypt 数字证书&#xff0c;并安装cerbot快速上手教程~~Let‘s Encrypt SSL证书介绍如今&#xff0c;越来越多的网站已经由HTTP迁移到HTTPS安全协议了。HTTPS不但能够避免网站内容在传输过程中被恶意篡改&#xff0c;切实保护访问者的权益&#xff0c;还能够让搜索…

Java常用设计模式————单例模式

单例模式简介 90%以上的设计模式都或多或少的应用了接口和抽象类&#xff0c;而单例比较特殊&#xff0c;并没有接口的应用。 单例Singleton指仅仅被实例化一次的类。通常被用来代表那些本质上唯一的系统组件。————《Effective Java》 数据库连接获取类的对象可以是单例的…

最简明扼要的 Systemd 教程,只需十分钟

systemctl常用命令介绍~~~Systemctl是一个systemd工具&#xff0c;主要负责控制systemd系统和服务管理器。 Systemd是一个系统管理守护进程、工具和库的集合&#xff0c;用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。启动及服务大多数主流发行版要…