Springboot个人浅析

101 阅读5分钟

#什么是springboot?

在springboot出现之前,我们要构建一个项目,需要一个经验丰富的同事,话费大量的时间来构造一个项目,或者公司内部有一个脚手架性质的框架来去根据我们的配置生成一个默认的项目。一个新手短时间内,基本上很难自己动手去实现一个可以在tomcat中完全运行起来的项目。
在之前springmvc大行其道的时候,或者更早的spring+struts+hibernate等,我们需要很多的配置文件来描述我们做的事情。比如,注入,service,repository等。
springboot的出现,解放了程序猿的双手,它让程序猿在开发中,可以更加简单和快捷的实现service component repository等相关的配置,并且内置了tomcat,不需要我们打包并单独部署到tomcat服务器中,一站式的解决了配置文件复杂和启动部署麻烦的问题

#约定优于配置

约定优于配置,相当于是一种规范。毕竟开发人员的水平参差不齐,每个人的开发习惯更加的是千奇百怪,我们不能要求每个人能做到同样的事情,但是我们可以要求开发人员按照一个既定的标准或者方法去做某些事情。比如开发中的驼峰命名,比如spring会自动读取application.properties中的配置信息,而不会自动取读取一个test.xml 中的配置信息。约定相当于是将一些既有的标准抽象出来。我们都认为某些事情就是这样的。这样在项目开发过程中我们不需要去在做每件事的时候对改事件或动作进行单独的声明。让项目变的更加清晰易懂,见名知意
这样也会让maven等三方工具只需要配置少量的配置文件就可以更快的完成自动编译打包等

约定由于配置:让一些约定俗成的的一些规范成为准则,让使用者不再去配置很多的配置信息,只需要较少的配置信息+约定俗成的配置,就可以简单的完成更多的工作

#@SpringBootApplication由哪几个注解组成,这几个注解分别表示什么作用

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中:@Target    @Retention     @Documented     @Inherited四个注解属于jdk自带的原生注解,主要是用来表明该注解的作用范围,作用时间,将注解信息添加到Javadoc中以及表明该注解可以被继承

@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan是属于spring中的注解。主要作用
@SpringBootConfiguration:作用主要是将那些没有配置类似于@component@service的类,用到@Bean注解的,将这些类注册到spring容器中进行托管。

@EnableAutoConfiguration:开启自动装配功能,作用主要是解决了由项目B引用项目A中的包的类,同时可以排除不需要的类。自动读取/META-INF/spring.factories中的配置项。
@ComponentScan:包扫描,扫描出指定路径下的所有的需要spring托管的类。如果指定value的话,默认扫描当前目录下的所有的包

#springboot自动装配的实现原理

通过@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan这三个注解,将整个项目中配置了@service @component@Bean @Import等相关配置的类数据,进行自动加载,并注册到spring容器中进行托管。
通过约定优于配置,在项目启动时会扫描所有的带指定注解的类或者指定配置文件中的所有类进行加载。不需要用户手动的去写很多的配置文件。从而达到自动装配的目的

#spring中的spi机制的原理是什么?

SPI service provider interface 服务提供接口。主要是JDK针对于第三方的厂商或者插件提供的一种服务发现机制,为接口寻找指定的实现方法。开箱即用
SPI的思想:
    系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制
SPI的约定:
    当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了。
spring在实现自动装配的过程中,会去扫描classpath:下面的/META-INF/spring.factories的配置文件,然后将该配置文件解析出来,取出该配置文件中的类名,然后自动加载到spring容器中