写在前面
本文看下springboot相关的基础内容。
1:从spring到springboot
在工作中,如果是我们想要引入某个框架,比如引入springMVC,就需要在web.xml中配置DispatcherServlet,在springmvc的配置文件中配置视图解析器等,同理,对于其他框架也都要进行响应的配置,但其实,整个配置的过程其实就是在spring IOC容器中创建框架需要的spring bean,像下图:
其实,我们要使用的各种功能对应的配置,在不通的项目中配置几乎都是相同的过程,而不同的是什么呢?基本上就是ip地址,端口号,用户名,密码这些,所以真正需要开发人员做的其实就是提供这些不确定的内容就行了,确定的配置过程,让程序来做就好,而springboot就是来做这个事情的,引入了springboot上面的过程可能变为下图:
所以,springboot的目标就是让开发变得简单,让配置变得简单,让运行变得简单。
2:springboot的使用
我们有两种方式来创建一个最简单的springboot项目,第一种是使用spring官方提供的脚手架 ,也可以使用idea内置的创建springboot项目的功能(内部也是调用https://start.spring.io)
,我们以idea为例看下,首先,new-project
选择Spring Initializer,如下图:
之后next,录入gav,jdk版本等信息:
再next,这一步选择我们想要使用的功能,需要什么就选择什么就行了,比如这里选择了spring-messaging中的spring for rabbitmq,就代表我们需要使用rabbitmq,如下图:
接着,next,finishi,就OK了,如下图:
之后我们就可以通过Main函数来启动我们的springboot应用了。
3:springboot的原理
在springboot应用的main函数中都会写一个注解@SpringBootApplication,这是一个组合注解,组合了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan等注解,其中的@EnableAutoConfiguration最为重要,当解析到该注解后,就会解析classpath下所有的META-INF/spring.factories
文件中的自动配置类,其中自动配置类的key是EnableAutoConfiguration类的全限定名称,如下,springboot官方提供的100多个自动配置类:
之后,就会自动加载这些通过javaconfig方式配置的信息,但并不是无脑加载,只有在满足条件注解的才会加载,对应的注解是@ConditionOnXxxx,如@ConditionOnBean就是当spring IOC容器中存在的某个bean时才加载,完整的如下:
接着就可以加载@Bean注解的方法来生成生成spring bean了,但是此时还有一个问题,不同的环境使用的配置是不同的,如数据库的地址,端口,用户名密码等信息不同,springboot是这样做的,约定了会读取spring.profile.active的值,以此来确定读取哪套配置文件,而默认加载的配置文件是application.yml/application.properties
,还会加上带有环境信息的配置文件application_{spring.profile.active}.yml/application_{spring.profile.active}.properties
,到这里,为了方便获取配置的信息,springboot定义了@ConfigurationProperties,用子一个类上,其中指定了preffix属性用来设置读取哪些值设置的类的属性上,如下:
@ConfigurationProperties(
prefix = "spring.rabbitmq"
)
public class RabbitProperties {
private static final int DEFAULT_PORT = 5672;
private static final int DEFAULT_PORT_SECURE = 5671;
private String host = "localhost";
private Integer port;
private String username = "guest";
private String password = "guest";
}
就会读取以spring.rabbitmq
为前缀并拼接上属性名称,从配置文件中获取值,如配置文件中配置了spring.rabbitmq.host=192.168.9.87
,则最终创建的RabbitProperties的实例,host值就是192.168.9.87,接着我们只需要将配置类对应的spring bean注入到自动配置类中,自动配置类就能动态的使用用户提供的配置文件来创建功能需要的spring bean了,如下实例:
@Configuration(proxyBeanMethods = false) // java config
@ConditionalOnClass({ RabbitTemplate.class, Channel.class }) // 条件注解
@EnableConfigurationProperties(RabbitProperties.class) // 启动自动配置类,这样会自动将该bean作为参数传递到方法中(这是我猜测的,不一定对!)
@Import(RabbitAnnotationDrivenConfiguration.class) // 引入其它javaconfig类
public class RabbitAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(ConnectionFactory.class)
protected static class RabbitConnectionFactoryCreator {
@Bean
public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties properties /* 封装了配置文件内容的对象 */,
ResourceLoader resourceLoader, ...) throws Exception {}
这样子,springboot的自动配置就完成了!