spring boot starter,自定义Spring starter
spring boot starter,自定义Spring starter详细介绍
本文目录一览: 如何理解Spring Boot中的Starter?
一个工作了3年的Java程序员,遇到一个Spring Boot的问题。
他对这个问题有一些了解,但是回答得不是很好,希望参考我的高手回答。
这个问题是:“如何理解Spring Boot中的Starter”。
对于这个问题,看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。。。。
高手:
Starter是Spring Boot的四大核心功能特性之一,除此之外,Spring Boot还有自动装配、Actuator监控等特性。
Spring Boot里面的这些特性,都是为了让开发者在开发基于Spring生态下的企业级应用时,只需要关心业务逻辑,
减少对配置和外部环境的依赖。
其中,Starter是启动依赖,它的主要作用有几个。
Starter组件以功能为纬度,来维护对应的jar包的版本依赖,
使得开发者可以不需要去关心这些版本冲突这种容易出错的细节。
Starter组件会把对应功能的所有jar包依赖全部导入进来,避免了开发者自己去引入依赖带来的麻烦。
Starter内部集成了自动装配的机制,也就说在程序中依赖对应的starter组件以后,
这个组件自动会集成到Spring生态下,并且对于相关Bean的管理,也是基于自动装配机制来完成。
依赖Starter组件后,这个组件对应的功能所需要维护的外部化配置,会自动集成到Spring Boot里面,
我们只需要在application.properties文件里面进行维护就行了,比如Redis这个starter,只需要在application.properties
文件里面添加redis的连接信息就可以直接使用了。
在我看来,Starter组件几乎完美的体现了Spring Boot里面约定优于配置的理念。
另外,Spring Boot官方提供了很多的Starter组件,比如Redis、JPA、MongoDB等等。
但是官方并不一定维护了所有中间件的Starter,所以对于不存在的Starter,第三方组件一般会自己去维护一个。
官方的starter和第三方的starter组件,最大的区别在于命名上。
官方维护的starter的以spring-boot-starter开头的前缀。
第三方维护的starter是以spring-boot-starter结尾的后缀
这也是一种约定优于配置的体现。
以上就是我对这个问题的理解。
总结
在技术的学习过程中,我认为“为什么是” 比 “是什么”要重要。
以这种方式来学习,带来的好处就是对技术理解会更加深刻。
这道题考察的就是“为什么是”,不难,关键在于自己的理解。
如果你喜欢这篇文章,记得点赞和收藏。
如果想获得一对一的面试指导以及面试资料,可以私信我。
springboot starter 原理解析及实践
starter是springBoot的一个重要部分。通过starter,我们能够快速的引入一个功能,而无需额外的配置。同时starter一般还会给我提供预留的自定配置选项,我们只需要在application.properties中设置相关参数,就可以实现配置的个性化。
那么这些方便的操作是怎么实现的呢?通过了解其原理,我们也可以做一个自己的starter,来让别人快速使用我们的功能。
按个人理解,我认为springBoot Starter就是一个 智能化的配置类 @Configuration 。
接下来介绍内容包括:
1、【创建module】,首先我们自定义一个starter的module,根据你的starter实现复杂度,引入相关spring组件。最基本的,我们只需引入 spring-boot-autoconfigure 模块。
2、【业务bean实现】实现我们的业务bean,案例中我们实现最简单的sayHello服务,输入msg,返回“hello,{msg}”。
3、然后就是Configuration类的创建,这个类是starter自动初始化的核心类,负责把业务相关的bean智能的加载进来。
4、配置 spring.factories ,通过该配置,才能让springboot来自动加载我们的Configuration类。具体原理我们稍后深入了解。
具体的,是在模块的 resources/META-INF 目录下,新建 spring.factories 文件。内容如下:
最后我们把上述模块单独执行以下install或者deploy,一个starter就做好了。
其他项目使用我们的starter就非常简单了:(1)引入starter依赖;(2)注入需要的service。
done!
回头再看上边的开发流程,有两个地方需要我们了解一下:
(1)如何让starter被自动识别加载:spring.factories里的EnableAutoConfiguration原理。
(2)如何实现自动加载的智能化、可配置化:@Configuration配置类里注解。
这里我们只简单的说一下大致的原理和流程,执行细节大家可以按照文章给出的思路自己去研读。
在SpringBoot的启动类,我们都会加上 @SpringBootApplication 注解。这个注解默认会引入 @EnableAutoConfiguration 注解。然后 @EnableAutoConfiguration 会 @Import(AutoConfigurationImportSelector.class) 。
AutoConfigurationImportSelector.class 的selectImports方法最终会通过 SpringFactoriesLoader.loadFactoryNames ,加载 META-INF/spring.factories 里的 EnableAutoConfiguration 配置值,也就是我们上文中设置的资源文件。
实际使用中,我们并不总是希望使用默认配置。比如有时候我想自己配置相关功能,有时候我想更改一下默认的服务参数。这些常见的场景Starter都想到了,并提供了如下的解决方案:
springboot starter提供了一系列的 @Conditional* 注解,代表什么时候启用对应的配置,具体的可以去查看一下springboot的官方文档。
比如我们案例中的 「@ConditionalOnClass(DemoHelloService.class)」,代表如果存在DemoHelloService类时,配置类才会生效;又比如「@ConditionalOnMissingBean(DemoHelloService.class)」,代表着如果项目中没有DemoHelloService类型的bean,那么该配置类会自动创建出starter默认的DemoHelloService类型bean。
这个注解主要是为了解决如下场景:我想要使用starter的默认配置类,但是又想对配置中的某些参数进行自定义配置。 @ConfigurationProperties 类就是做这个工作的。例如上述例子中,我想对默认的defaultMsg做些个性化的设置。就可以按如下方式来实现:
starter新增ConfigurationProperties类bean
启用property
在实际项目中自定义默认msg
SpringBoot的Starter机制
我们知道SpringBoot自己在“后台”帮我们配置了很多原本需要我们手动去的东西,至于这个“后台”是啥,就是Starter机制。我们先来看一看常用的Starter启动器,他们都是以spring-boot-starter开头明名的,至于spring-boot这个前缀则被Spring Boot官方保留。
至于Starter机制是如何实现上文说的“自动变速箱”功能,简单说就是通过条件注解来实现的,SpringBoot通过条件注解确定需要加载哪些组件,读取哪些配置,还有一些控制加载顺序的注解。这里我们先来看一些常用的条件注解和控制加载顺序的注解:
这里以一个简单的SpringBoot中的依赖配置文件做说明,只加入最基础的配置。
可以看到有如下几个依赖需要加入:
1)spring-boot-starter-parent,这个是所有SpringBoot工程都需要加入的依赖项,可以说这个是一个“根依赖”,必须要加入,注意这里指定的版本号也会约束其他依赖项,相当于一个最上层的版本配置,这里指定的就是我们常说的SpringBoot的版本。
2)spring-boot-starter-web,这个是Web工程的依赖项,所有的Web程序都要加。
3)spring-boot-configuration-processor,这个是ConfiguaritionProperties的配置,有了它我们的Spring项目中的Jar就会包含上很多meta-data,这些元数据会在开发的时候通过idea给我们很多输入的提示。
可以说这是SpringBoot项目中最重要的配置文件,这里看下关于他的几个核心部分,首先关于它的描述是这样的:
大意是说这个文件是一个提供了通过maven编译的应用的依赖和插件管理一个“父配置文件”。嗯,就理解是管理基础依赖和插件的就可以了。
看他的resource标签,是这样的:
这里指定了资源的导入和导出路径,什么意思?就是你的配置文件配在对应的目录下,框架都会去扫描到读取的,按上面的配置会读src/main/resources目录下的配置文件的内容。比如我们在这里放了如下的配置文件:
这样程序启动的会去读application.properties和application.yml文件里面的配置的。这里要说一下,上面的配置加载是有顺序的,先加yml,yaml ,后加properties里面的配置,这也决定了properties文文件配置的优先级是要高于yaml文件的,或者说相同参数的配置,properties里面的参数会覆盖yaml里面的。
最后看到最上面还有一个parent标签,是这样描述的,这里描述了spring-boot-starter-parent的父依赖配置spring-boot-dependencies:
同样的我们看一看spring-boot-dependencies的描述文件,看看里面的properties标签,是这样:
喔,好多似曾相识的面孔在这里都能见到,比如aspectj,caffeine, dom4j,hikaricp,junit,log4j2, mysql,tomcat等等一些,而且你也看到了,这里帮我们把版本控制也做好了,防止了原来在Spring中我们自己手动引入依赖的时候的经常会发生的版本冲突问题,所谓的约定优于配置在这里就是一个典型的体现场景。
这个配置是web应用的核心配置,有了他不用像Spring再像Spring一样去导SpringMVC相关的依赖了,这里看一下这个文件的内容。
同样的也有一个parent标签指定父依赖spring-boot-starters.
另外dependencies标签指定是一些依赖坐标的打包,包含json,tomcat等等,包含版本控制都做好了。
其中spring-boot-starter的依赖又包含了如下的dependencies,有spring-boot,自动配置,日志,注解,core等等的依赖:
以上可以看到SpringBoot基本上通过spring-boot-starter-parent和spring-boot-starter-web两个配置就把起步依赖需要导入的依赖项把我们需要的依赖给导完了,这也就是SpringBoot的starter机制在依赖配置层的最好体现,实现了所谓约定优于配置。
只需4步,自己搞个 Spring Boot Starter !
只要你用Springboot,一定会用到各种spring-boot-starter。其实写一个spring-boot-starter,仅需4步。下面我们就写一个starter,它将实现,在日志中打印方法执行时间。
在使用spring-boot-starter,会发现,有的项目名称是 XX-spring-boot-starter,有的是spring-boot-starter-XX,这个项目的名称有什么讲究呢?从springboot官方文档摘录如下:
从这段话可以看出spring-boot-starter命名的潜规则。
命名潜规则
spring-boot-starter-XX是springboot官方的starter
XX-spring-boot-starter是第三方扩展的starter
打印方法执行时间的功能,需要用到aop,咱们的项目就叫做 aspectlog-spring-boot-starter 吧。
项目的pom文件如下:
关于spring-boot-configuration-processor的说明,引自springBoot官方文档:
简单说就是:写starter时,在pom中配置spring-boot-autoconfigure-processor,在编译时会自动收集配置类的条件,写到一个 META-INF/spring-autoconfigure-metadata.properties 中。
本次我们就选用@ConditionalOnProperty。即配置文件中有aspectLog.enable=true,才加载我们的配置类。
下面开始写自动配置类
配置类简要说明:
当配置文件有 aspectLog.enable=true 时开启,如果配置文件没有设置 aspectLog.enable 也开启。
META-INF/spring.factories 是spring的工厂机制,在这个文件中定义的类,都会被自动加载。多个配置使用逗号分割,换行用\
如果有兴趣可以查看这2篇blog:
@Enable 驱动原理(设置连接)
@EnableAutoConfiguration 处理逻辑(设置连接)
这是我们最终的目录结构
在IDEA中,进行mvn intall
打包完成后,在其他项目中的pom中引入进行测试
你知道的SpringBoot中常用的starter都有哪些?
1. spring-boot-starter-web :提供 Spring MVC + 嵌入式的 Tomcat 。web开发一整套
2. mybatis-spring-boot-starter :提供 MyBatis持久层操作数据库
3. spring-boot-starter-test:提供完备的测试功能
4. spring-boot-starter-thymeleaf:提供Thymeleaf模板视图整合
5. spring-boot-starter-actuator:提供生产级监控
6. spring-boot-starter-data-jpa :提供 Spring JPA + Hibernate
7. spring-boot-starter-data-redis`:提供 Redis整合能力
8. spring-boot-starter-mail:提供邮件发送给你
如果你对上述常见的starter不了解,我强烈建议你学习一下SpringBoot,去黑马程序员官网视频库看免费视频。
自定义Spring starter
在Spring Boot中,使用的最多的就是starter。starter可以理解为一个可拔插式的插件,例如,你想使用JDBC插件,那么可以使用spring-boot-starter-jdbc;如果想使用MongoDB,可以使用spring-boot-starter-data-mongodb。
初学的同学可能会说:如果我要使用MongoDB,我直接引入驱动jar包就行了,何必要引入starter包?starter和普通jar包的区别在于,它能够实现自动配置,和Spring Boot无缝衔接,从而节省我们大量开发时间。
使用maven-archetype-quickstart骨架创建项目。
注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starter-{name}如 spring-boot-starter-web, Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式, 如mybatis-spring-boot-starter。这里创建的项目的artifactId为helloworld-spring-boot-starter
该类用于接收spring.properties中配置的参数,并自动赋值给对应的成员变量。
如果想要实现自动配置,还需要将XxxAutoConfiguration添加到spring.factories配置文件中。
注意:META-INF是自己手动创建的目录,spring.factories也是手动创建的文件,在该文件中配置自己的自动配置类。
Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包,
然后读取spring.factories文件获取配置的自动配置类AutoConfiguration,
然后将自动配置类下满足条件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)
这样使用者就可以直接用来注入,因为该类已经在容器中了
SpringBoot Starter自定义注解 - 接口加解密
目标
本章我们将编写一个starter,目标如下:
1、对外提供 @OpenAPI 注解,使用此注解它会对接收的请求数据进行解密,对要返回的数据进行加密。
2、完成服务端使用示例
3、完成前端调用示例
加密规则
1、对业务数据进行AES加密,示意代码:encryptData=AES("业务数据", aesKey)
2、对AES的key进行公钥加密,示意代码:encryptKey=RSA(aesKey, 公钥)
3、签名sign=md5(encryptData+encryptKey)
加密后请求示例
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
请求参数
服务端返回示例
pom.xml
定义注解
配置公私钥
具体代码逻辑
定义切面和自动装配
spring.factories
服务端修改
在业务项目中引入jar 包
配置公私钥
改动的地方很少,只需要在原接口增加@OpenAPI注解即可
前端修改
修改前代码
修改后要先对参数加密,然后对返回数据解密
安装两个加密库
封装RSA、AES和Base64加解密
springboot框架优点
SpringBoot框架的优点有:可快速构建独立的Spring应用、直接嵌入Tomcat、Jetty和Undertow服务器(无需部署WAR文件)、提供生产就绪功能等等。
1、可快速构建独立的Spring应用:SpringBoot是一个依靠大量注解实现自动化配置的全新框架。在构建Spring应用时,我们只需要添加相应的场景依赖,SpringBoot就会根据添加的场景依赖自动进行配置,在无须额外手动添加配置的情况下快速构建出一个独立的Spring应用。
2、直接嵌入Tomcat、Jetty和Undertow服务器(无需部署WAR文件):传统的Spring应用部署时,通常会将应用打成WAR包形式并部署到Tomcat、Jetty或Undertow服务器中。SpringBoot框架内嵌了Tomcat、Jetty和Undertow服务器,而且可以自动将项目打包,并在项目运行时部署到服务器中。
3、提供生产就绪功能:SpringBoot提供了一些用于生产环境运行时的特性,例如指标、监控检查和外部化配置。其中,指标和监控检查可以帮助运维人员在运维期间监控项目运行情况;外部化配置可以使运维人员快速、方便地进行外部化配置和部署工作。
SpringBoot的核心功能介绍:
1、独立运行:SpringBoot开发的应用可以以JRA包的形式独立运行,运行一个SpringBoot应用只需通过java-jar xxxx.jar来运行。
2、内嵌容器:SpringBoot内嵌了多个WEB容器,如:Tomcat、Jetty、Undertow,所以可以使用非WAR包形式进行项目部署。
3、自动starter依赖:SpringBoot提供了一系列的starter来简化Maven的依赖加载。starter是一组方便的依赖关系描述符,它将常用的依赖分组并将其合并到一个依赖中,这样就可以一次性将相关依赖添加到Maven或Gradle中。
4、自动配置:SpringBoot会根据在类路径中的JAR包和类,自动将类注入SpringBoot的上下文中极大地减少配置的使用。
以上内容参考:百度百科-SpringBoot
springboot常用注解
springboot常用注解有@SpringBootApplication;@Repository;@Service;@RestController;@ResponseBody。
1、Spring Boot 是 Pivotal 团队在 Spring 的基础上提供的一套全新的开源框架,其目的是为了简化 Spring 应用的搭建和开发过程。Spring Boot 去除了大量的 XML 配置文件,简化了复杂的依赖管理。Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。
2、@SpringBootConfiguration注解,继承@Configuration注解,主要用于加载配置文件。@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
3、starter 是 SpringBoot 中一种非常重要的机制,它可以繁杂的配置统一集成到 starter 中,我们只需要通过 maven 将 starter 依赖引入到项目中,SpringBoot 就能自动扫描并加载相应的默认配置。starter 的出现让开发人员从繁琐的框架配置中解放出来,将更多的精力专注于业务逻辑的开发,极大的提高了开发效率。
210630:springBoot自动配置-自定义start
Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:
当然,自动配置原理的相关描述,官方文档貌似是没有提及。不过我们不难猜出,Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!
@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,翻译成人话就是 开启自动配置 ,其定义如下:
而这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。
这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:
这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。
每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,常见的 条件注解 有如下几项:
以ServletWebServerFactoryAutoConfiguration配置类为例,解释一下全局配置文件中的属性如何生效,比如:server.port=8081,是如何生效的(当然不配置也会有默认值,这个默认值来自于org.apache.catalina.startup.Tomcat)。
在ServletWebServerFactoryAutoConfiguration类上,有一个@EnableConfigurationProperties注解: 开启配置属性 ,而它后面的参数是一个ServerProperties类,这就是习惯优于配置的最终落地点。
在这个类上,我们看到了一个非常熟悉的注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,而@EnableConfigurationProperties负责导入这个已经绑定了属性的bean到spring容器中(见上面截图)。那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。
至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。
而诸多的XxxxAutoConfiguration自动配置类,就是Spring容器的JavaConfig形式,作用就是为Spring 容器导入bean,而所有导入的bean所需要的属性都通过xxxxProperties的bean来获得。
可能到目前为止还是有所疑惑,但面试的时候,其实远远不需要回答的这么具体,你只需要这样回答:
Starter可以理解为一个可拔插式的插件,提供一系列便利的依赖描述符,您可以获得所需的所有Spring和相关技术的一站式服务。应用程序只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。用一句话描述,就是springboot的场景启动器。
官方定义的starter命名都是spring-boot-starter-xxx,我们自己定义的一般都 xxx-spring-boot-starter,新建一个ruangh-id-gengerate-spring-boot-starter项目
导入springboot 包spring-boot-starter
定义一个映射配置新的的类IdProperties和LockieProperties,添加注解ConfigurationProperties("machine.id"),我们的配置文件以machine.id开头,比如mathine.id.name=boot-order,另外一个配置是已spring.lockie开头的
IdService里面有个getId方法用来生成自定义的ID
在resources目录下创建META-INF目录,并添加文件spring.factories。在这个文件中配置EnableAutoConfiguration,具体如下:
创建一个模块,在pom文件中增加依赖
启动类上添加注解
配置文件增加配置参数
添加测试类
运行一下查看结果,看到结果是我们想要的,至此我们自定义一个starter就成功了,总结一下就是要创建3个类1个配置文件, xxProperties,xxService,xxAutoConfiguation和spring.factories