为什么需要有Springboot,我们知道一些脚本语言框架在web应用开发方面非常方便,比如常见的ROR,Node,php等,而使用tomcat开发一个简单的hello world的页面服务器就需要做很多配置,尽管可以使用之前的SSH web三剑客,但也仍然比较麻烦。Springboot通过开箱即用的组件化的方式简化了这一切,让javaer也可以享受到脚本语言一样的快速高效。
Springboot如何实现开箱即用的。我们知道Springboot是基于Spring框架,要实现开箱即用,有两点比较重要,第一,可以自动将组件加载到Spring容器中;第二,提供一种默认配置,同时也可以进行自定义。这样在引入一个组件之后,系统自动加载代码与默认配置,无需任何其他操作就可以直接使用,如何有特殊需求,可以修改配置来进行自定义。
首先第一点,自动加载Bean主要是利用SpringFactoriesLoader,类似Java SPI机制,我们在很多其他地方也常常见到,比如Logger,java中的logging会根据引入的jar包中的logfactory文件来查找目前使用的logger框架,同样,Springboot也会查找当前路径下jar中各个starter中的spring.factories文件,找到每个组件的扩展信息,例如ApplicationContextInitializer,ApplicationListener,EnableAutoConfiguration等,其中EnableAutoConfiguration非常重要,Springboot会将所有的查找到的EnableAutoConfiguration加载到容器中,这样可以完成组件的初始化,Bean加载等操作了。其次每个组件会设置一套需要的配置数据元数据,并且一般都会有一套默认数据,而且用户还可以在application.properties中进行自定义,最小化简化用户配置。
例如如果要为一个RPC框架提供一个Springboot的组件,可以直接引入starter就可以使用,应该如何实现呢。
我们可以为RPC的服务端与消费端分别定义一个注解:@Provider 与@Consumer, 每个注解里面会有一些服务需要的参数,例如版本号,超时时间等,然后新增一个RPCEnableAutoConfiguration,让RPCEnableAutoConfiguration中首先初始化RPC需要的一些信息,例如与地址注册服务器的链接等,然后扫描容器中的所有带有@Provider 与@Consumer中的Bean或者字段信息,然后根据每个注解中的信息生成RPC需要的Bean并注册到容器,这样就实现了一个RPC开箱即用的组件了。要达到的效果大致如下:
参考文献: