SpringBoot学习笔记

SpringBoot学习笔记

春节期间,对SpringBoot作了一些学习,记录点心得。
SpringBoot是Spring发展史的一个新的起点,有很是多新的特性。其中最重要的特性是自动化,原先咱们在Spring中不少的Config类及Bean的定义都不须要了,是个很是大的优势。java

初始配置

让咱们从Maven配置开始,已经最大程度简化了。从下面的配置中,咱们能够看到依赖中不包含版本信息,由于SpringBoot很是好的作了测试,对应版本都是可用的。若是须要使用更高的版本,须要进行下测试。
须要注意的是,SpringBoot默认不包含MyBatis,须要单独添加。web

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.1.1</version>
    </dependency>

入口注解

SpringBoot应用都是从SpringBootApplication这个注解开始,其代码以下,咱们分析下其内部特性。spring

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

}

@SpringBootConfiguraion就是标准的配置,里面直接能够定义Bean,但须要知道的是一个SpringBoot只能出现一次这个注解。tomcat

@ComponetScan默认扫描相同包下的Bean,若是是其余的就须要配置。能够加一些简单的过滤去,选择或者排除掉一些特定的Bean。springboot

@EnableAutoConfiguration最为关键,下面会详述。服务器

自动配置

@EnableAutoConfiguration,这个是SpringBoot的核心:自动配置。
简单来讲,若是咱们的程序包里包含了某个class,把某一个jar包放进来,Spring会猜想咱们但愿用到里面的某些Bean。这个时候,SpringBoot就会定义一个Config的配置,把jar包里的Bean定义好,而后能够自动的纳进来。就是说咱们不用定义Bean了,也不用写Config文件。SpringBoot就自动加载进来,好处是已经作了好多的现成模块能够用。websocket

其机制是经过定义一个Configuration的class,里面能够经过配置,将其余的Configuration引入进来。在jar包下META-INF/spring.factories文件里面会定义的是接口类和接口实现类。已经实现的引入都存放在spring-boot-autoconfigure下面,默认引入很是多有100多个,基本开发中的常见模块都包括了,这个配置是提早作好的,是标准化和最优化的,能够参考来学习。下面是部分片断的示例。mybatis

Initializers
org.springframework.context.ApplicationContextInitializer= org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer, org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
Application Listeners
org.springframework.context.ApplicationListener= org.springframework.boot.autoconfigure.BackgroundPreinitializer
Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration= org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,

自动配置示例

下面看一下Spring Web的配置示例,是比较复杂的,但同时将本地环境和生产环境的状况都考虑了进去。能够称之为一种最佳实践。
@ConditionalOnWebApplication表示只有在web服务器才会加载。
而且没有定义Tomcat工厂类,且存在Tomcat.class和Servlet.class,就自动建立。框架

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(BeanPostProcessorsRegistrar.class)
public class EmbeddedServletContainerAutoConfiguration {
    /**
     * Nested configuration if Tomcat is being used.
     */
    @Configuration
    @ConditionalOnClass({ Servlet.class, Tomcat.class })
    @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
    public static class EmbeddedTomcat {

        @Bean
        public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
            return new TomcatEmbeddedServletContainerFactory();
        }

    }
}

小结

SpringBoot的核心思想简单来讲就是不重复造轮子,主要针对原先在工程中比较繁琐的依赖和配置管理的工做,无侵入式的实现也很是符合Spring的传统哲学。
整个框架既不智能,也没有真正的自动化,但经过最佳实践的积累和框架的包装,提供了一种拿来即用的工做方式。易用性是框架生命力的重要来源,尤为对于初学者来讲,会产生很是大的帮助。socket

相关文章
相关标签/搜索