弹簧引导实战教程之自动配置详解

  

  

大家应该都有所了解,随着Ruby、Groovy等动态语言的流行,相比较之下Java的开发显得格外笨重。繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着春天家族中的新春天星引导的诞生,这些问题都在逐渐被解决。

  

个人觉得弹簧引导中最重要的两个优势就是可以使用起动机简化依赖配置和春天的自动配置。下面这篇文章将给大家详细介绍弹簧引导自动配置的相关内容,话不多说,来一起看看详细的介绍。

  

  

春提供了一系列起动器来简化Maven配置。其核心原理也就是Maven和Gradle的依赖传递方案。当我们在我们的pom文件中增加对某个起动机的依赖时,该起动器的依赖也会自动的传递性被依赖进来。而且,很多起动器也依赖了其他的起动器,例如web启动就依赖了tomcat启动,并且大多数起动器基本都依赖了spring-boot-starter。

  

  

弹簧引导会根据类路径中的jar包,类,为jar包里的类自动配置,这样可以极大的减少配置的数量。简单点说就是它会根据定义在类路径下的类,自动的给你生成一些Bean,并加载到春天的背景中。自动配置充分的利用了Spring 4.0的条件化配置特性,能够自动配置特定的Spring Bean,用来启动某项特性。

  

  

假设你希望一个或多个bean只有在某种特殊的情况下才需要被创建,比如,一个应用同时服务于中美用户,要在中美部署,有的服务在美国集群中需要提供,在中国集群中就不需要提供。在春天4之前,要实现这种级别的条件化配置是比较复杂的,但是,春天4引入了一个新的@Conditional注解可以有效的解决这类问题。

        @ bean   @Conditional (ChinaEnvironmentCondition.class)   公共ServiceBean ServiceBean () {   返回新ServiceBean ();   }      

当<代码> @Conditional (ChinaEnvironmentCondition.class) 条件的值为true的时候,该ServiceBean才会被创建,否则该bean就会被忽略。

  

@Conditional指定了一个条件。他的条件的实现是一个Java类,ChinaEnvironmentCondition要实现以上功能就要定义ChinaEnvironmentCondition类,并继承条件接口并重写其中匹配的方法。

        {类ChinaEnvironmentCondition实现条件   公众最终布尔匹配(ConditionContext上下文,AnnotatedTypeMetadata元数据){      环境env=context.getEnvironment ();   返回env.containProperty (“ENV_CN”);   }   }      

在上面的代码中,匹配方法的内容比较简单,他通过给定的ConditionContext对象进而获取环境对象,然后使用该对象检查环境中是否存在ENV_CN属性。如果存在该方法则直接返回真,反之返回错误的。当该方法返回真正的时候,就符合了@Conditional指定的条件,那么ServiceBean就会被创建。反之,如果环境中没有这个属性,那么这个ServiceBean就不会被创建。

  

除了可以自定义一些条件之外,春季4本身提供了很多已有的条件供直接使用,如:

        @ConditionalOnBean   @ConditionalOnClass   @ConditionalOnExpression   @ConditionalOnMissingBean   @ConditionalOnMissingClass   @ConditionalOnNotWebApplication      

  

自动配置充分的利用了spring 4.0的条件化配置特性,那么,弹簧引导是如何实现自动配置的?春天4中的条件化配置又是怎么运用到弹簧引导中的呢?这要从春天引导的启动类说起.Spring引导应用通常有一个名为*应用程序的入口类,入口类中有一个主要的方法,这个方法其实就是一个标准的Java应用的入口方法。一般在主方法中使用<代码> SpringApplication.run() 来启动整个应用。值得注意的是,这个入口类要使用@SpringBootApplication注解声明.@SpringBootApplication是弹簧引导的核心注解,他是一个组合注解。

        @Target ({ElementType.TYPE})   @Retention (RetentionPolicy.RUNTIME)   @Documented   @Inherited   @SpringBootConfiguration   @EnableAutoConfiguration   @ComponentScan (   excludeFilters={@Filter (   类型=FilterType.CUSTOM,   类={TypeExcludeFilter.class}   ),@Filter (   类型=FilterType.CUSTOM,   类={AutoConfigurationExcludeFilter.class}   )}   )   公共@ interface SpringBootApplication {//略   }      

@SpringBootApplication是一个组合注解,它主要包含@SpringBootConfiguration, @EnableAutoConfiguration等几个注解。也就是说可以直接在启动类中使用这些注解来代替@ SpringBootApplication注解。关于弹簧引导中春天的自动化配置主要是@EnableAutoConfiguration的功劳。该注解可以让弹簧引导根据类路径中的jar包依赖为当前项目进行自动配置。

弹簧引导实战教程之自动配置详解