springboot 整合其他组件时通常在启动类加EnableXXX ,暂时总结如下:
@EnableMyComponent
public class EnableMyComponentApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(EnableMyComponentApp.class);
applicationContext.refresh();
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
applicationContext.close();
}
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 1. 通过Configuration注解的类来实现
//@Import(HelloWorldConfiguration.class)
// 2. 通过 ImportSelector接口实现
// @Import(HelloWorldImportSelector.class)
// 3. 通过ImportBeanDefinitionRegistrar接口实现
@Import(HelloWorldImportBeanDefinitionRegistrar.class)
public @interface EnableMyComponent {
}
@Configuration
public class HelloWorldConfiguration {
@Bean
public User user(){
return new User("Marina", 35);
}
}
/**
* ImportSelector 实现
*/
public class HelloWorldImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.example.springsecuritymyy.enable.HelloWorldConfiguration"};
}
}
/**
* ImportBeanDefinitionRegistrar 实现
* @see ImportBeanDefinitionRegistrar
*/
public class HelloWorldImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(HelloWorldConfiguration.class);
BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
}
通过注解类实现
@Import(HelloWorldConfiguration.class)通过注解导入ImporterSelector实现类
比如:
1. 启动类加@EnableDiscoveryClient
2. 注解中导入ImportSelector实现类@Import(EnableDiscoveryClientImportSelector.class)
- 通过注解导入ImportBeanDefinitionRegistrar实现类
比如:
1. 启动类加@EnableFeignClients
2. 注解中导入ImportSelector实现类 @Import(FeignClientsRegistrar.class)