摘要

主要是的分析Springboot的最核心的 3 个注解详解(@​​SpringBootConfiguration​​​、@​​ComponentScan​​​、@​​EnableAutoConfiguration​​)

  • @SpringBootConfiguration:继承自Configuration,支持JavaConfig的方式进行配置。加载相关的bean对象
  • @EnableAutoConfiguration:@Import就是加载的INF下面的Spring.Factory的相关的配置类到beandefinitionMap的加载气的配置类。这里里面涉及到SPI技术。
  • @ComponentScan:加载相关的类中添加了@CompenScan+、@Repository、@Service、@Compent、@Controller类到beandefinitionMap中

1、@Configuration

这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。

下面几个相关注解也是非常重要的!

@Bean

用来代替 XML 配置文件里面的 ​​<bean ...>​​ 配置。

@ImportResource

如果有些通过类的注册方式配置不了的,可以通过这个注解引入额外的 XML 配置文件,有些老的配置文件无法通过 ​​@Configuration​​ 方式配置的非常管用。

@Import

用来引入额外的一个或者多个 ​​@Configuration​​ 修饰的配置文件类。

@SpringBootConfiguration

这个注解就是 ​​@Configuration​​ 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展,源码如下。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

2、@ComponentScan

这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 ​​component-scan​​​ 配置,开启组件扫描,即自动扫描包路径下的 ​​@Component​​​ 注解进行注册 bean 实例到 context 中。另外,​​@ComponentScans​​ 是可重复注解,即可以配置多个,用来配置注册不同的子包。

3、@EnableAutoConfiguration

Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。

org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader)

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {

String factoryClassName = factoryClass.getName();

try {

Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :

lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));

List<String> result = new ArrayList<String>();

while (urls.hasMoreElements()) {

URL url = urls.nextElement();

Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));

String factoryClassNames = properties.getProperty(factoryClassName);

result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));

}

return result;

}

catch (IOException ex) {

throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +

"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);

}

}

这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类。

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

在默认的情况下,Spring Boot会根据项目中的jar包依赖,自动做出配置,Spring Boot支持的自动配置非常多。如果我们想要关闭一些自动配置的话,我们可以通过手动修改核心注解配置我们不想要自动配置的jar 包。比如(但是一般我们不这么做):

@SpringBootApplication(exclude = {DispatcherServlet.class})

Spring Boot 全局配置文件

Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下。在这个配置文件中你可以做一些服务器与Spring 的相关配置以及日志打印等等(在这个配置文件中可以

Xml 配置文件

虽然Spring Boot 已经为我们做了很多的配置,但是如果在相关的项目中你仍然需要xml 文件做一些额外的配置,那么Spring Boot 也是支持的。你可以在入口类通过​​@ImportResource​​ 进行xml 配置文件的导入并且支持对多个xml 文件的配置。

@ImportResource({"classpath:*.xml","classpath:**.xml"})

Spring Boot 全局配置文件路径设置

Spring boot 默认会扫描 application.properties 或者 application.yml 配置文件,自动扫描的路径有以下 4 个:按照优先级排序为:file/config/,file/,classpath/config/,classpath/,高优先级会覆盖低优先级的配置文件。采用的覆盖非失效覆盖,而是通过覆盖实现互补配置。项目发布的时候,还可以通过命令参数 spring.config.location= 设置配置文件的路径。在项目启动时候进行动态的设置。