新建的项目结构如下图:

1.POM 文件

项目会默认依赖 spring-boot-starter-parent 项目

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

这个parent项目又依赖下面

  <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
spring-boot-dependencies 这个依赖里面定义spring boot 真正依赖的jar包和适配的版本号,所以后面的依赖就不用定义版本号,spring boot 已经自动适配了合适的版本。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

同时还依赖了spring-boot-starter-*,spring boot 官方文档 https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#using-boot-dependency-management ,13.5 章节介绍了这些Satrter ,根据文档,这些starter 是spring boot 根据实际应用场景封装的一系列场景启动器,可以为我们提供相应场景的一站式服务,比如我们需要data-jpa支持,我们只要导入spring-boot-starter-data-jpa 这个启动器即可,spring boot 会导入相应jar包,并自动配置相应的场景。

pom文件中同时还有关于 Spring Boot Maven 插件,它可以将项目打成单独的jar包,通过java -jar 命令已独立的应用形式来运行。

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2.启动类

项目类路径下有一个名称为***Application 的类

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

@SpringBootApplication 这个注解的意思是:将当前类标志为主程序类,程序的运行入口为这个类。这个注解是多个注解的组合

@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这个注解的意思是:开启spring boot 自动配置功能,然后通过AutoConfigurationImportSelector 来选择应该自动将哪些自动配置导入到容器中,要导入的自动配置组件都在META-INF/spring-autoconfigure-metadata.properties这个配置文件中有相应配置。在spring-boot-autoconfigure-2.0.4.RELEASE.jar 里面有所有Starter自动配置,在相应的自动配置类里面可以看到配置的生效条件,和我们可以自己配哪些属性。以dao的自动配置为例

@ConditionalOnClass(PersistenceExceptionTranslationPostProcessor.class)
public class PersistenceExceptionTranslationAutoConfiguration { @Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.dao.exceptiontranslation", name = "enabled", matchIfMissing = true)
public static PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(
Environment environment) {
PersistenceExceptionTranslationPostProcessor postProcessor = new PersistenceExceptionTranslationPostProcessor();
boolean proxyTargetClass = environment.getProperty(
"spring.aop.proxy-target-class", Boolean.class, Boolean.TRUE);
postProcessor.setProxyTargetClass(proxyTargetClass);
return postProcessor;
} }
@ConditionalOnClass 类路径下有 PersistenceExceptionTranslationPostProcessor的class时生效
@ConditionalOnMissingBean 意思是没有这个组件的时候生效,我们可以配置的内容是 spring.dao.exceptiontranslation,没有配置的情况下的默认值是true。
官方文档的15至16介绍了关于自动配置的其他内容。我们可以自己编写自定义的配置和禁用部分自动配置。如何编写自己的自动以类呢?
官方文档是这么说的,我们可以不用将所有 的配置放在,我们只需要自己编写配置类,并让它加载进容器中就可以了。比如
@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
//@ComponentScan(basePackages={"xx.xx.xx.MyConfig,xx.xx.xx.MyAnotherConfig"})
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }

或者 在Application 中已@Bean的注解来创建一个组件,并将组件加入到容器中

@Import注解的意思是将类作为组件加载到容器中

@ComponentScan 注解的意思的将路径的中的类作为组件天剑到容器中。由于Application 默认扫描的是当前所在目录及其下级目录的组件,所以一般情况下不需要声明扫包的路径,但是如有其它第三方的的包可以用这种方式将组件添加到容器中。

如何禁用自动配置呢?官方文档的16.2章节有 说明。比如下面:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*; @Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

自定义一个Configuration,通过exclude排除不需要自动配置的组件。然后再主程序中将这个配置类添加到容器中即可。

关于这条件注解分为以下几类:
注解 处理类 处理逻辑 实例
@Conditional OnBeanCondition 当给定的类型、类名、注解、昵称在beanFactory中存在时返回true.各类型间是or的关系 @ConditionalOnBean
(CacheManager.class)
@ConditionalOnSingleCandidate OnBeanCondition 当给定类型的bean存在并且指定为Primary的给定类型存在时,返回true @ConditionalOnSingleCandidate
(DataSource.class)
@ConditionalOnMissingBean OnBeanCondition 当给定的类型、类名、注解、昵称在beanFactory中不存在时返回true.各类型间是or的关系 @ConditionalOnMissingBean
@ConditionalOnClass OnClassCondition 当给定的类型、类名在类路径上存在时返回true,各类型间是and的关系 @ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
@ ConditionalOnMissingClass OnClassCondition 当给定的类名在类路径上不存在时返回true,各类型间是and的关系 @ConditionalOnMissingClass(“org.thymeleaf.templatemode.TemplateMode”)
@ConditionalOnCloudPlatform OnCloudPlatformCondition 当所配置的CloudPlatform为激活时返回true @ConditionalOnCloudPlatform(CloudPlatform.CLOUD_FOUNDRY)
@ConditionalOnExpression OnExpressionCondition 如果该表达式返回true则代表匹配,否则返回不匹配 @ConditionalOnExpression(“true”)
@ConditionalOnJava OnJavaCondition 运行时的java版本号是否包含给定的版本号.如果包含,返回匹配,否则,返回不匹配 @ConditionalOnJava(ConditionalOnJava.JavaVersion.EIGHT)
@ConditionalOnJndi OnJndiCondition 给定的jndi的Location 必须存在一个.否则,返回不匹配 @ConditionalOnJndi({ “java:comp/TransactionManager”})
@ConditionalOnNotWebApplication OnWebApplicationCondition 不在web环境时返回匹配 @ConditionalOnNotWebApplication
@ConditionalOnWebApplication OnWebApplicationCondition 不在web环境时返回匹配 @ConditionalOnWebApplication
@ConditionalOnProperty OnPropertyCondition 配置的属性存在时匹配 @ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true)
@ConditionalOnResource OnResourceCondition 指定的资源必须存在,否则返回不匹配 @ConditionalOnResource(resources = “classpath:META-INF/build-info.properties”)

spring boot-3.原理探究的更多相关文章

  1. Spring Boot 运作原理

    Spring Boot 运作原理 1.Spring Boot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了 ...

  2. Spring Boot启动原理解析

    Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置 ...

  3. Spring Boot运行原理

    概述 本文主要写了下Spring Boot运行原理,还有一个小例子. Spring4.x提供了基于条件来配置Bean的能力,而Spring Boot的实现也是基于这一原理的. Spring Boot关 ...

  4. spring boot启动原理步骤分析

    spring boot最重要的三个文件:1.启动类 2.pom.xml 3.application.yml配置文件 一.启动类->main方法 spring boot启动原理步骤分析 1.spr ...

  5. Spring Boot核心原理

    Spring Boot核心原理 spring-boot-starter-xxx  方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...

  6. Spring Boot 启动原理分析

    https://yq.aliyun.com/articles/6056 转 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启 ...

  7. Spring Boot 运行原理

    Spring Boot并没有任何新的技术,全都是基于Spring4提供的技术,用优秀的设计,为Web开发提供了一套新的方式. 在HelloWorld中,我们没有进行任何显示的配置,但是程序还是运行起来 ...

  8. Spring boot运行原理-自定义自动配置类

    在前面SpringBoot的文章中介绍了SpringBoot的基本配置,今天我们将给大家讲一讲SpringBoot的运行原理,然后根据原理我们自定义一个starter pom. 本章对于后续继续学习S ...

  9. spring boot 启动原理详细解析

    我们开发任何一个Spring Boot项目,都会用到如下的启动类 1 @SpringBootApplication 2 public class Application { 3 public stat ...

  10. Spring Boot高频面试题:Spring Boot执行原理

    之前一篇文章Spring Boot快速入门文章中,我们已经体会到Spring Boot的神器,不再像之前Spring那样需要繁琐的XML,甚至几秒钟就能搭建出Spring的项目骨架.接下来我们简单分析 ...

随机推荐

  1. C# 扩展、常用方法

    项目基本做完了,抽空整理下里面用到的扩展方法,以及复用度很高的代码,省的以后到处去找. 一.C#扩展方法——Distinct去重 二.C#扩展方法——获得枚举Description 三.C#扩展方法— ...

  2. shell练习--PAT试题1010:一元多项式求导 (25 分)(失败案例喜加一)

    ---恢复内容开始--- 1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系 ...

  3. CSS之咖啡菜单网页设计

    今天记录学习的设计网站首页的咖啡菜单,综合运用所学习的html,css背景,文本,字体,链接,表格,盒子,选择器,定位,以及css3的阴影,圆角边框,2d变换等内容. ㈠咖啡菜单整体样式 运用html ...

  4. react 的className动态修改

    https://blog.csdn.net/suwyer/article/details/81481507(copy) <div style={{display: (index===this.s ...

  5. EL表达式无效问题

    引起原因web.xml中: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  6. python爬取智联招聘职位信息(单进程)

    我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...

  7. JavaScript插件制作-tab选项卡

    JavaScript插件制作练习-鼠标划过选项卡切换图片 <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. python学习之路(14)

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...

  9. [CSP-S模拟测试]:小Y的图(最小生成树+LCA)

    题目传送门(内部题131) 输入格式 第一行三个整数$n$.$m$和$Q$. 接下来$m$行每行三个整数$x$.$y$.$z$($1\leqslant x,y\leqslant n,1\leqslan ...

  10. CentOS 6.5上的Tomcat启动报错问题

    最近在搭建虚拟机环境,装的是CentOSQL 6.5版本,然后装的OpenJDK1.7,在Apache下载了一个纯净的Tomcat放到虚拟机上启动报错了: 这里有两个错误: 1.第一个错误,APR的问 ...