zoukankan      html  css  js  c++  java
  • SpringBoot学习笔记

    SpringBoot学习笔记

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

    初始配置

    让我们从Maven配置开始,已经最大程度简化了。从下面的配置中,我们可以看到依赖中不包含版本信息,因为SpringBoot非常好的做了测试,对应版本都是可用的。如果需要使用更高的版本,需要进行下测试。
    需要注意的是,SpringBoot默认不包含MyBatis,需要单独添加。

      <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这个注解开始,其代码如下,我们分析下其内部特性。

    @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只能出现一次这个注解。

    @ComponetScan默认扫描相同包下的Bean,如果是其他的就需要配置。可以加一些简单的过滤去,选择或者排除掉一些特定的Bean。

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

    自动配置

    @EnableAutoConfiguration,这个是SpringBoot的核心:自动配置。
    简单来说,如果我们的程序包里包含了某个class,把某一个jar包放进来,Spring会猜测我们希望用到里面的某些Bean。这个时候,SpringBoot就会定义一个Config的配置,把jar包里的Bean定义好,然后可以自动的纳进来。就是说我们不用定义Bean了,也不用写Config文件。SpringBoot就自动加载进来,好处是已经做了好多的现成模块可以用。

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

    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的传统哲学。
    整个框架既不智能,也没有真正的自动化,但通过最佳实践的积累和框架的包装,提供了一种拿来即用的工作方式。易用性是框架生命力的重要来源,尤其对于初学者来说,会产生非常大的帮助。

  • 相关阅读:
    Codeforces Round #450 (Div. 2)
    吉哥系列故事——恨7不成妻(数位DP)
    Codeforces Round #546 (Div. 2)
    Balanced Numbers (数位DP)
    XHXJ's LIS(数位DP)
    Balanced Number(数位DP)
    (2016北京集训十三)【xsy1533】mushroom
    (2016北京集训十三)【xsy1532】网络战争
    (2016北京集训十三)【xsy1531】魔法游戏
    (2016北京集训十二)【xsy1542】疯狂求导
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/6358409.html
Copyright © 2011-2022 走看看