SpringBoot(二)SpringBoot原理解析

springboot启动结构图:分为三部分

第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,

第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,

第三部分是自动化配置模块,该模块作为springboot自动配置核心

启动:

​ 每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解,以及@ImportResource注解(if need),@SpringBootApplication包括三个注解,功能如下:

@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。

@SpringBootConfiguration(内部为@Configuration):被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。

@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下。

SpringBoot我们都知道是由Pivotal团队开发的,创建的初始目的是为了简化spring的初始化的框架搭建和和开发过程。springboot使用了特定的方式来进行配置,我们不需要再使用样板化的配置。不仅简化了配置的复杂度,还能提高整体的开发效率。

SpringBoot:

他能独立的创建spring的应用程序,可以说是对spring的进一步封装。

他有内嵌的Tomcat,这样就不需要再部署war文件了,也就不需要在配置启动服务开关。

大大的简化了maven的配置,在使用spring的时候需要导入Tomcat的plugin,现在只需要导入springboot的依赖即可。

可以说是拿来即用,属于一种生产就绪的工具。

我们在开发任何一个springboot项目的时候,都会用到这样的启动类:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在这个方法中最关注的就是springbootapplication和springapplication.run类。从他的annotation的定义中我们能发现,他其实组合型的注解。它里面定义多了注解。

@Target(ElementType.Type) //他是用来描述注解的适用范围,其中Type是用来描述类、接口、包括的注解的类型以及枚举的声明。

@Retention(RetentionPolicy.RUNTIME) //注解的生命周期,并且保留到class文件中(三个生命周期)

@Documented //表明这个注解应该被javadoc记录

@Inherited //子类可以继承该注解

@SpringBootConfiguration //继承了Configuration,表示当前是注解类

@EnableAutoConfiguration //开启springboot的注解功能,是springboot的四大神器之一,借助import的帮助

@ComponentScan(excludeFilters={ //扫描路径设置,具体路径待确认

})

这里定义了多个annotation进行了原信息的标注,但实际上只用了三个:

@Configuration(@SpringBootConfiguration点开其实还是应用了Configuration)

@EnableAutoConfiguration

@CompnentScan

如果使用这里的SpringBoot启动类,整个项目仍然与之前的项目启动功能相等:

@Configuration

@EnableAutoConfiguration

@ComponentScan

每次写这三个注解很辛苦,是由我们一般使用了@SpringBootApplication来替代它,使之用起来更方便。这里对这三个注解做一下介绍:

一、@Configuration:

这里的@Configuration相对来说并不陌生,因为他就是javaConfig(java配置形式)形式的Spring IOC容器配置类使用的Configuration。SpringBoot推荐使用基于JavaConfig的配置形式。因此这里的启动类标注了@Configuration之后,其本身就是一个IOC容器的配置类。

举一个简单的例子来回顾一下xml和config配置方式的区别:
1、表达形式层面

xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
       
      <!--bean定义--> 
       
 </beans>      

基于javaconfig的配置:

@Confguration

public class MockConfiguration{

}

任何一种标注了@Configuration的Java类定义都是一个javaConfig配置类

2、注册bean定义的层面

基于xml的配置形式:

<bean id="mockService" class="..MockServiceImpl">
    ...
</bean>

基于Javaconfig的配置形式:

@Configuration
public class MockConfiguration{
    @Bean
    public MockService mockService(){
        return new MockServiceImpl();
    }
}

任何以一个标注@Bean的方法,其返回值将作为一个bean(实体类)定义注册到spring的IOC容器,方法名将默认成为该bean定义的ID。

3、表达依赖注入关系层面

为了表达bean于bean之间的依赖关系,我们在xml的配置是这样的:

<bean id="mockService" class="..MockServiceImpl">
2     <propery name ="dependencyService" ref="dependencyService" />
3 </bean>
4 
5 <bean id="dependencyService" class="DependencyServiceImpl"></bean>

@基于javaConfgi的配置是这样的:

@Configuration
  public class MockConfiguration{
      @Bean
      public MockService mockService(){
          return new MockServiceImpl(dependencyService());
      }
      
      @Bean
      public DependencyService dependencyService(){
         return new DependencyServiceImpl();
     }
 }

这里如果一个bean的定义依赖于其他bean,那么直接调用对应的javaconfig中依赖于bean配置的方法即可

提到@Configuration就会想到他的搭档@Bean,使用这两个注解,可以创建一个简单的spring配置类,可以用来代替响应的xml配置文件。

<beans> 
    <bean id = "car" class="com.test.Car"> 
         <property name="wheel" ref = "wheel"></property> 
     </bean> 
     <bean id = "wheel" class="com.test.Wheel"></bean> 
</beans>

相当于:

@Configuration 
  public class Conf { 
      @Bean 
      public Car car() { 
          Car car = new Car(); 
          car.setWheel(wheel()); 
          return car; 
      }
      
     @Bean 
     public Wheel wheel() { 
         return new Wheel(); 
     } 
 }

@Configuration注解标识了注解可以使用spring IOC容易作为bean定义的来源

@bean注解告诉spring,该注解的方法将会返回一个对象,这个对象被注册为spring应用程序上下文中的bean

二、@ComponentScan

@ComponentScan在spring中很重要,对应着xml中的配置元素。它对应的功能就是自动扫描并加载符合条件的组件(如@Component和@Repository)或者bean定义。最终将这些bean定义加载到IOC容器中。

我可以通过basepackages属性来细粒度的定制扫描范围。如果不指定范围,就会扫描配置了@CompontentScan这个类所在的包空间。

所以springboot的启动类最好是放在rootpackage下面,这样就不用指定basepackage了。

三、@EnableAutoConfiguration

这个注解也是比较重要的。在spring框架中提供了各种以@Enable为开头的注解。如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,他的做事方式一脉相承,借助@import来收集和注册特定场景下的相关bean的定义。

  • @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
  • @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。

@EnableAutoConfiguration借助@Import的帮助将符合条件的bean定义加载到IOC容器。@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring
MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。

如果面试使用可以直接背下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值