likes
comments
collection
share

Spring自动加载

作者站长头像
站长
· 阅读数 12

spring.factories 有什么作用

spring.factories 是 Spring 框架中用于自动加载配置文件的一个重要机制。通过在 spring.factories 文件中指定需要自动加载的类,Spring 容器启动时会自动扫描指定的包,将指定的类加载到容器中,从而实现自动化配置。

在 Spring Boot 中,很多自动化配置都是通过 spring.factories 实现的。比如,当我们引入 Spring Boot Starter Data JPA 依赖时,就会自动配置 JPA 相关的一些 Bean,这些 Bean 就是通过 spring.factories 实现自动加载的。

总之,spring.factories 是 Spring 框架中非常重要的一个机制,通过它可以实现很多自动化配置的功能。

spring.factories@Configuration 有什么不同

spring.factories@Configuration 都是 Spring 自动加载的方式,但是它们有不同的使用场景。

@Configuration 是一种基于 Java 配置的方式,它用于定义应用程序的配置信息。我们可以在 @Configuration 类中使用 @Bean 注解来定义 Bean,Spring 容器在启动时会自动扫描 @Configuration 类,并将其中的 Bean 加载到容器中。

相比之下,spring.factories 更多的是一种基于配置文件的方式,它可以实现很多自动化配置的功能。我们可以在 spring.factories 文件中指定需要自动加载的类,Spring 容器在启动时会自动扫描指定的包,将指定的类加载到容器中。这种方式适用于一些需要动态加载配置的场景,比如 Spring Boot 中的自动化配置功能。

因此,@Configurationspring.factories 都是 Spring 自动加载的方式,但是它们的使用场景有所不同。在选择使用哪种方式时,需要根据实际情况进行判断。

@Configuration@AutoConfiguration有什么区别

spring-boot提倡通过annotation来进行bean的配置,现在spring-boot里面常用的两种创建bean的方式有auto-configuration和configuration两种方式。

先说说configuration方式,就是使用@configuration注解和@bean注解来初始化想要的bean对象

@Configuration @Slf4j public class SecondBeanConfiguration { @Bean @ConditionalOnMissingBean public SecondBean secondBean() { log.info("log second bean"); return new SecondBean("secondBean", 2); } }

然后在启动的时候@ComponentScan注解会扫描包(路径可以指定,默认的情况下就是这个目录所在的包开始扫描),这个注解扫到@configuration注解以后,就会初始化这个类下面所有加了@bean的方法,并初始化这个bean

再来说说auto-configuration,spring-boot有一个@EnableAutoConfiguration注解,他通过读取spring.factories文件里面的EnableAutoConfiguration下面指定的类,来初始化指定类下面的所有加了@bean的方法,并初始化这个bean

spring.factories文件:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.dragon.study.spring.boot.configuration.auto.config.AutoFirstBeanConfiguration,\ com.dragon.study.spring.boot.configuration.auto.config.AutoSecondBeanConfiguration

具体的代码

@Slf4j
@Configuration
public class AutoFirstBeanConfiguration {  
  @Bean  
  @ConditionalOnMissingBean  
  public AutoFirstBean autoFirstBean() {
     log.info("log auto first bean");   
     return new AutoFirstBean("autoFirstBean", 1);  
  }
}

那么这两种方式有什么不同呢?

  • 就是初始化的时机configuration初始化的方式总是在auto-configuration初始化方式之前
  • configuration初始化的顺序和扫描的过程相关,并不能进行有效的进行指定,不方便确定文件加载的顺序
  • auto-configuration可以通过@AutoConfigureAfter @AutoConfigureBefore@AutoConfigureOrder来指定类的加载顺序
  • configuration初始化会先初始化所有被扫到加了@Configuration文件的@PostConstruct注解然后再初始化这些文件里面的@Bean注解,但是auto-configuration是根据文件来进行初始化的,所以会初始化完一个文件的@PostConstruct注解然后再初始化这个文件的@Bean注解,然后再接着处理另外的文件。

所以需要提供bean给其他jar包进行使用的时候,最好使用 auto-configuration 方式(spring-boot-starters里面的都是通过这种方式来进行提供的,他的所有初始化的过程全部在spring-boot-autoconfigure项目中),因为能更好的控制类文件的加载顺序。有助于维护更佳复杂的项目。

另外需要注意一点的就是,如果auto-configuration提供的类名称在扫描的路径之中,spring-boot会把这些类作为configuration先进行初始化了,然后@AutoConfigureAfter @AutoConfigureBefore@AutoConfigureOrder 这类指定顺序的注解都会失效。

在 Spring 框架中,spring.factories 文件是用于自动加载配置文件的重要机制。下面是一个样例代码:

# Auto Configuration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
com.example.config.MyAutoConfiguration

其中,org.springframework.boot.autoconfigure.EnableAutoConfiguration 是一个键,它的值是一个字符串,表示需要自动加载的类的全限定名。当 Spring 容器启动时,会自动扫描指定的包,将指定的类加载到容器中,从而实现自动化配置。

spring.factories 在 Spring Boot 中得到了广泛的应用。很多自动化配置都是通过 spring.factories 实现的。比如,当我们引入 Spring Boot Starter Data JPA 依赖时,就会自动配置 JPA 相关的一些 Bean,这些 Bean 就是通过 spring.factories 实现自动加载的。

总之,spring.factories 是 Spring 框架中非常重要的一个机制,通过它可以实现很多自动化配置的功能。