Spring Family - Spring related, Spring Boot

Spring Boot相对于SpringMVC的一些特点:

内置http服务器,devtool可以马上验证代码;

基于Spring4.0设计;

spring-boot-starter-parent是parent pom,也是spring-boot-dependencies的子pom

通过spring-boot-starter-web整合Spring和SpringMVC

Spring Boot启动后会访问Spring folder及其以下的文件吗?


Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合);


//@response body的正常解释:

@responsebody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。比如

异步获取json 数据,加上 @responsebody 后,会直接返回 json 数据


@AutoWired byType 方式


做过web 开发的同学一定都有用过 @Controller , @Service , @Repository 注解,查看其源码你会发现,他们中有一个共同的注解@Component ,没错 @ComponentScan 注解默认就会装配标识了 @Controller , @Service , @Repository , @Component 注解的类到 spring容器中。

https://zhuanlan.zhihu.com/p/46887997 “这是介绍Spring Boot最好的一篇文章”

Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置:

1、@Configuration: 用来代替 applicationContext.xml 配置文件

@Bean: 用来代替 XML 配置文件里面的  配置

@ImportResource: 如果有些通过类的注册方式配置不了的,可以通过这个注解引入额外的 XML 配置文件,有些老的配置文件无法通过 @Configuration 方式配置的非常管用

@Import: 用来引入额外的一个或者多个 @Configuration 修饰的配置文件类

@SpringBootConfiguration: 这个注解就是 @Configuration 注解的变体,只是用来修饰Spring Boot的配置而已,或者可利于 Spring Boot 后续的扩展

2、@ComponentScan

这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中

3、@EnableAutoConfiguration 和第一个一样,也有Configuration, 上面那个更关注applicationContext, 即上下文,其实controller端更关注DispatcherServlet和Spring配置文件的位置,而service更关注applicationContext也是Spring的配置文件;而@EnableAutoConfiguration是用来装配类的。。。简称自动装配。。。

org.springframework.boot.autoconfigure.EnableAutoConfiguration

看全路径就知道,这是自 Spring Boot 诞生时添加的注解,用来提供自动配置,上面的两个都是 spring-context 包下的,不属于 Spring Boot,所以 Spring 3.0 之后的去 XML 配置方式已经为 Spring Boot 埋下了伏笔

意思是:Spring 3.0就在为去XML配置方式做努力了,而@EnableAutoConfiguration就是Spring Boot的一个原生标签

习惯优于配置,此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找

Spring IOC的两种实现:基础的就是BeanFactory,高级的就是ApplicationContext


其实这个 @SpringBootApplication 注解就包含了以上 3 个主要注解,平时没有自定义配置的需求,则使用 @SpringBootApplication 注解完全就可以了:

让我们来看下 @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的核心处理类是AutoConfigurationImportSelector

AutoConfigurationImportSelector实现了DeferredImportSelector

ImportSelector的解析在ConfigurationClassParser#processImports中处理在其中this.deferredImportSelectorHandler.handle(..)j将DeferredImportSelector放入队列,延后处理。DeferredImportSelector处理逻辑在ConfigurationClassParser#parse中的this.deferredImportSelectorHandler.process()中。

AutoConfigurationImportSelector.AutoConfigurationGroup的process,selectImports就是我们需要关注的核心方法。

ConfigurationClassParser#doProcessConfigurationClass中的!this.conditionEvaluator.shouldSkip(...) 结合了各种Condition注解,实现了自定义配置覆盖自动装配。

https://blog.51cto.com/u_11475121/2958013

@EnableAutoConfiguration 的作用:https://www.cnblogs.com/kevin-yuan/p/13583269.html说得很清楚

@EnableAutoConfiguration 的作用是开启 Spring 应用上下文的自动配置,它会尝试去猜测和配置我们所需要的 bean。 例如:如果我们的 classpath 中有 tomcat-embedded.jar,那么我们可能需要一个 TomcatServletWebServerFactory 的 bean。

@EnableAutoConfiguration 试图尽可能的智能化: 1, 当我们的 classpath 中存在某些 jar 或者类时,它会帮助我们自动配置 bean; 2, 当我们定义自己的配置时,自动配置的 bean 将不再加载。(具体是通过 一系列的 @ConditionalOnXxx 来实现的)

我们也可以通过注解中的 exclude() 来手动排除任何不想用的配置。 如果没有权限访问到指定排除的类的话,可以使用 excludeName(),或者 spring.autoconfigure.exclude 来指定

当使用 @SpringBootApplication 时,@EnableAutoConfiguration 是自动启用的。


@EnableAutoConfiguration和@Configuration有什么区别?

需要提供bean给其他jar包进行使用的时候,最好使用@EnableAutoConfiguration方式

@Configuration会先实现,然后@EnableAutoConfiguration会根据依赖按顺序实现;总之这两者之后,你就不用担心配置和依赖了;

SpringBoot执行流程

使用SpringApplication.run()启动,在该方法所在类添加@SpringBootApplication注解,该注解由@EnableAutoConfiguration和@ComponentScan等注解组成,@EnableAutoConfiguration自动加载SpringBoot配置和依赖包,默认使用@ComponentScan扫描当前包及子包中的所有类,将有spring注解的类交给spring容器管理

不管是applicationContext*下的bean、配置文件,还是@EnableAutoConfiguration自动加载SpringBoot配置和依赖包,还是@ComponentScan扫描当前包及子包中的所有类,反正都在@SpringBootApplication里面了

所以@EnableAutoConfiguration还是专注在配置和依赖

----------------------------------

下面的介绍是正解,来自:https://www.jdon.com/50200

@EnableAutoConfiguration:告诉Spring Boot根据你添加的jar依赖关系“猜测”你想要如何配置Spring;主要是导入jar包之类的类;通过它spring会自动配置Tomcat和Spring MVC;借助@Import的支持,收集和注册特定场景相关的bean定义;

Xml配置文件等于@Configuration注释的类,像@bean注解的类或xml文件里类,在Spring Boot里可以通过@Configuration这个注解来导入;

@ComponentScan:扫描所有使用@Component 的类




@Configuration

@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器

自动配置幕后英雄:SpringFactoriesLoader

@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器

你可能感兴趣的:(Spring Family - Spring related, Spring Boot)