Spring通過注解注入組件


組件聲明

在類上聲明 @Component、@Configuration、@RestController、@Service、@Repository 等注解,表示這個類需要被注入IoC容器。

1、@Configuration 和 @Bean

@Configuration 常用來和 @Bean 配合使用,來注入第三方組件。

例子:注入 Druid 數據源

@Configuration
public class DruidConfig {
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource")
  public DataSource druidDataSource() {
    return new DruidDataSource();
  }
}

2、FactoryBean

通過實現接口 FactoryBean 來注入

例子:利用 FactoryBean 注入 Dog

// 實現 FactoryBean
public class DogFactoryBean implements FactoryBean<Dog> {

  // 對象
  @Override
  public Dog getObject() throws Exception {
    return new Dog();
  }

  // 類型
  @Override
  public Class<?> getObjectType() {
    return Dog.class;
  }

  // 是否單例,true表示是單例
  @Override
  public boolean isSingleton() {
    return true;
  }
}
// 注入 DogFactoryBean
@Configuration
public class MyConfig {
  @Bean
  DogFactoryBean dog() {
    return new DogFactoryBean();
  }
}

通過名字 dog 可以獲取容器中的 Dog 對象;如果想獲取 DogFactoryBean 對象,可以用 &dog 來獲取。

3、@Import

在類上聲明,可以快速注入多個第三方的類,常配合 ImportSelector、ImportBeanDefinitionRegistrar 使用

例子:注入 Dog、Cat 類
方式 1:注解注入

@Import({Dog.class, Cat.class})
public class MyConfig {}

方式 2:實現接口 ImportSelector

// 實現 ImportSelector
public class MyImport implements ImportSelector {
  @Override
  public String[] selectImports(AnnotationMetadata metadata) {
    return new String[]{"com.xxx.Dog", "com.xxx.Cat"};
  }
}
// 導入 MyImport
@Import({MyImport.class})
public class MyConfig {}

方式 3:實現接口 ImportBeanDefinitionRegistrar

// 實現 ImportBeanDefinitionRegistrar
public class MyImportBean implements ImportBeanDefinitionRegistrar {
  @Override
  public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    BeanDefinition dogBean = new RootBeanDefinition(Dog.class);
    registry.registerBeanDefinition("dog", dogBean);
    BeanDefinition catBean = new RootBeanDefinition(Cat.class);
    registry.registerBeanDefinition("cat", beanDefinitions);
  }
}
// 導入 MyImportBean
@Import({MyImportBean.class})
public class MyConfig {}

4、@Conditional

可以自定義滿足條件后才注入組件。

例子:當容器中存在 Dog 時,才注入 Cat

// 實現 Condition
public class MyCondition implements Condition {
  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    for (String name : Objects.requireNonNull(context.getBeanFactory()).getBeanDefinitionNames()) {
      if ("com.xxx.Dog".equals(name)) {
        return true;
      }
    }
    return false;
  }
}
// 按條件注入 Cat
@Configuration
public class MyConfig {
    @Conditional(MyCondition.class)
    @Bean
    Cat cat() {
        return new Cat();
    }
}

Springboot 提供了一些 @Conditional 的實現

@ConditionalOnClass:存在該類時生效
@ConditionalOnBean:存在該Bean是生效
@ConditionalOnProperty:配置正確時生效
@ConditionalOnResource:資源存在是生效

5、其它注解

Springboot 提供的配置生效順序的注解

@AutoConfigureAfter:在指定的配置類生效后再注入
@AutoConfigureBefore:在指定的配置類生效后再注入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM