美文网首页
Spring Family - Spring related,

Spring Family - Spring related,

作者: 外腾湖南 | 来源:发表于2022-03-13 08:13 被阅读0次

    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 配置文件里面的 <bean ...> 配置

    @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,

          本文链接:https://www.haomeiwen.com/subject/hlvkdrtx.html