main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...

一、概述

  • 使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行。这是跟传统的将项目打包成war包,然后部署到tomcat服务器去运行的一个区别。
  • 而在应用当中,这个包含main方法的启动类需要放在项目的根目录,与所有包平级,一般在main方法内部通过执行SpringApplication.run方法来启动应用。启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三个注解组成,分别是:@SpringBootConfiguration,@ComonentScan,@EnableAutoConfiguration。所以也可以单独使用这三个注解。
  • 一个典型的SpringBoot项目结构如下:
a64694f49b6685bbf40f3066a16f1f66.png

二、注解分析

@SpringBootConfiguration:配置类

  • 继承于@Configuration,本身只是说明这是一个SpringBoot项目的配置类,功能与@Configuration一样,使得Spring容器知道需要跟处理@Configuration注解的类一样处理这个类。

@ComponentScan:基于注解的类扫描

  • 用于进行包扫描,检查类是否使用了@Controller,@Service等注解,有则获取这些类创建对应的bean对象注册到Spring的IOC容器;

@EnableAutoConfiguration:SpringBoot的自动配置特性

  • 该注解是SpringBoot引入的,用于自动配置,即基于项目配置pom.xml引入的SpringBoot的starter相关包和项目添加的配置类,判断是使用SpringBoot的starter包提供的配置类还是使用项目定义的配置类,如假如在pom.xml中引入了spring-boot-starter-data-redis包,则如果项目没有自定义RedisTemplate类实现,则SpringBoot会自动配置和注入一个RedisTemplate对象到Spring的IOC容器中。
  • 工作过程为:扫描项目的所有包,检测项目中是否存在与SpringBoot自动添加的starter包对应功能组件类相同的类,或者实现了相同的接口或者继承了相同的父类的类,有则使用项目自身提供的该功能组件类实现,没有则使用SpringBoot自动添加的该功能组件类。SpringBoot的starter包自动添加的这些功能组件类通常是使用了@Configuration注解和@Conditional注解的,所以可以实现条件化注入。

三、main方法启动类位于项目根目录的原因

  • @ComponentScan注解有个特性:如果不指定需要扫描的包或者需要注册的类,则默认是扫描该使用@ComponentScan注解的类所在的包以及子包,所以将使用了@SpringBootApplication注解的包含main方法的启动类放在项目根目录,则会扫描项目的所有包。
  • 除了@ComponentScan注解之外,@EnableAutoConfiguration注解也是扫描使用了这个注解的类所在的包及其子包,故放在项目根目录,则可以扫描项目所有的包,对所有的类(具体为使用Spring容器管理的)进行检测,从而决定是否需要自动创建功能组件类的bean对象到spring的IOC容器中。

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

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

相关文章

学习笔记~~~~LinkedHashMap

LinkedHashMap实现了Map接口,继承了HashMap 应用场景 HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。 我们是按照7、2、3、4 的顺序插入的,但是输出结果并不是按照顺序的。 同样的数据&…

[转]Mysql Join语法解析与性能分析

转自:http://www.cnblogs.com/BeginMan/p/3754322.html 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表;table2:右表。 JOIN 按照…

css radial-gradient 径向渐变基本语法与使用

在之前的文章《深入理解Css linear-gradient线性渐变》我们了解了CSS中的线性渐变,本文将介绍CSS中的另一种渐变———径向渐变(Radial Gradient): CSS中的径向渐变(Radial Gradient)允许你创建从一个颜色…

华为鸿蒙系统技术细节盘点

面对安卓的限制,华为似乎十分淡定从容,丝毫都不慌,华为的底气,很大原因来自华为自研的操作系统——鸿蒙系统!鸿蒙系统刚提出来的时候就在各界媒体中炸开了花,花粉们对其关注程度也是只增不减,那…

spring boot2.x设置session有效时间_Spring 源码解析 Scopes 之 Request 、Session 、Application...

(给ImportNew加星标,提高Java技能)转自:开源中国,作者:麦克斯链接:my.oschina.net/wang5v/blog/3017934Request、Session、Application概念在这篇Spring源码解析-Singleton Scope(单例)和Prototype Scope(多例)博客中介…

[SQLite]使用记录

1. 自增列 1.1 隐藏的 rowid 1.2 显式创建 ID INTEGER PRIMARY KEY AUTOINCREMENT 其中 ID 可以改变为实际列名 使用自增长字段,引擎会自动产生一个sqlite_sequence表 sqlite3_last_insert_rowid() 返回最后插入的ID 2. 下载 SQLite 时,要选择 静态的不…

学习笔记~~~~~TreeMap

TreeMap继承了AbstractMap类,实现了NavigableMap、Cloneable、Serializable 接口 TreeMap也是一个很常用的map实现类,因为他具有一个很大的特点就是会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时&#xff0c…

程序员别再迷茫,赚钱,方法比你想的更多

每次打开公号,扑面而来一阵阵焦虑:95后毕业3个月就买房,你的同龄人正在抛弃你毕业3年,年薪超100万:赚钱,是一种修行一线城市财务自由门槛2.9亿,看看你还差多少说来说去就是,牛人跑得…

Mac 创建本地Mysql_2018-09-25:mac下创建本地数据库mysql

问题:如何在mac系统下,创建本地数据库mysql?过程:1.安装brew install mysql2.启动mysql过程中遇到的问题:(1)ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)解决过程&am…

.NET Core 学习资料精选:入门

开源跨平台的.NET Core,还没上车的赶紧的,来不及解释了……本系列文章,主要分享一些.NET Core比较优秀的社区资料和微软官方资料。我进行了知识点归类,让大家可以更清晰的学习.NET Core。首先感谢资料原作者的贡献。第一篇&#x…

学习笔记~~~~~Set接口实现

Java中提供了HashSet、TreeSet、LinkedHashSet三种常用的Set实现,以下具体分析它们的用法和性能。 我们使用Set的原因是Set集合不包含重复元素,HashSet、TreeSet和LinkedHashSet三种类型什么时候使用它们,使用哪个这是一个很重要的选择性问题…

15句乔布斯经典语录(中英文)

1.Life is brief, and then you die, you know?人生短暂,过着过着你就没了,明白么?2.Innovation distinguishes between a leader and a follower.领袖和跟风者的区别就在于创新。3.Were here to put a dent in the universe. Oth…

HashOperations

存储格式&#xff1a;Key>(Map<HK,HV>) 1.put(H key, HK hashKey, HV value) putAll(H key, java.util.Map<? extends HK,? extends HV> m) 2.get(H key, java.lang.Object hashKey) multiGet(H key, java.util.Collection<HK> hashKeys) &#xff1…

mysql一些常用操作_mysql的一些常用操作(一)

1.启动Mysql服务net start mysql2.进入mysql环境中&#xff0c;由于自己没有设置密码&#xff0c;直接回车进入即可(要将bin加入到环境变量path中)mysql -u root -p3.创建一个数据库create database db_test default character set utf8 collate utf8_general_ci;显示数据库&am…

关于程序员的脑筋急转弯(附答案)

1、程序猿最常去的是哪间酒吧&#xff1f;2、程序猿什么情况下会选择离职&#xff1f;3、0是假&#xff0c;1是真&#xff0c;请问这是真还是假&#xff1f;4、你怎样才能知道一个计算机科学家是内向还是外向的&#xff1f;5、为什么大部分Java程序员都是戴眼镜的&#xff1f;6…

怎么确保一个集合不能被修改

集合&#xff08;map,set,list&#xff09;都是引用类型&#xff0c;所以我们如果用final修饰的话&#xff0c;集合里面的内容还是可以修改的。 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合&#xff0c;这样改变集合的任何操作都会抛…

js 时间转东八区_js:固定与东八区服务器时间保持一致并且可选时间格式

datetimeparse (timestamp, format, prefix){//转换时区let currentZoneTime new Date(timestamp);let currentTimestampcurrentZoneTime.getTime();let offsetZone currentZoneTime.getTimezoneOffset() /60; //如果offsetZone>0是西区&#xff0c;西区晚let offsetnul…

js日期函数

对日期的处理&#xff0c;date类型和字符串类型的相互转换&#xff0c;日期合法性验证Date.prototype.isLeapYear 判断闰年 Date.prototype.toFormat 日期转成format格式字符串 Date.prototype.DateAdd 日期计算 Date.prototype.DateDiff 比较日期差 Date.prototype.toString 日…

以下十种性格的人不适合做程序员,你​赞同吗? ​

目录 1. 宁愿参加培训&#xff0c;也不愿意自学 2. 喜欢正常的上下班时间 3. 喜欢正常加薪而不是跳槽 4. 无法和同事和睦共处 5. 容易垂头丧气 6. 思想保守&#xff0c;不考虑他人建议 7. 不注重细节 8. 没有工作荣誉感 9. 不能做到三思而后行 10. 不喜欢极客类型的人 以下十种…

Iterator与ListIterator有什么区别

Iterator与ListIterator区别如下&#xff1a; 1、Iterator是ListIterator的父接口。 2、Iterator是单列集合(Collection)公共取出容器中元素的方式。 对于List&#xff0c;Set都通用。 而ListIterator是List集合的特有取出元素方式。 3、Iterator中具备的功能只有hashNext(),ne…