自动装配

基于Java对Spring代码配置

@Configuration
public Class AppConfig {
  @Bean
  public SampleService sampleService() {
    return new SampleService();
  }
}

@Bean注解用于修饰方法,方法的返回值会作为一个Bean装配到Spring容器。
@Configuration注解用于修饰一个类,表明这个类的作用是用来对Spring容器进行配置的。
上面的代码相当于XML配置

<beans> <bean id = "sampleService" class = "com.**.SampleService.class"/> </beans>

Java代码配置ComponentScan

@ComponentScan("com.**.service.impl")
@Configuration
public Class AppConfig {
}

上面的代码相当于XML配置

<beans> <context:component-scan base-package="com.**.service.impl"/> </beans>

使用@Import组合多个配置
Spring通常会创建多个配置类,再借助@Import将多个配置类组合成一个。

@Configuration
public class ConfigA {
  @Bean
  public A a() {
    return new A();
  }
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
  @Bean 
  public B b() {
    return new B();
  }
}

加载ConfigB的配置,就自动加载了ConfigA的配置。

@SpringBootApplication注解
@SpringBootApplication是一个组合注解,由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan构成

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM,
                classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication 

@EnableAutoConfiguration

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

将主配置类所在包及其子包的所有配置的Bean扫描加载到Spring容器,利用SpringFactoriesLoader机制加载自动装配配置,它的配置数据在META-INF/spring.factories中
notes:所有实现ImportSelector的类都会在启动时被ConfigurationClassParser中的processImports进行实例化并执行selectImports
1)SpringFactoriesLoader
loadSpringFactories(ClassLoader classLoader)会遍历整个ClassLoader中所有jar包下的spring.factories文件
2)AutoConfigurationImportSelector

// SpringFactoriesLoader会根据EnableAutoConfiguration.class去所有spring.factories里找对应的value
List<String> configurations = SpringFacotoriesLoader.loadFactoryName(EnableAutoConfiguration.class, ClassLoader);
// 加载对应的文件
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
classLoader.getResource(FACTORIES_RESOURCE_LOCATION);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容