1 注解定義
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
@Import注解由@Target({ElementType.TYPE})限制只能用在類上玩焰;
@Import注解用來導入配置類或者一些需要前置加載的類到IOC容器中。
2 @Import使用
2.1 直接填入需要加載的類
@Import({ 類名.class , 類名.class... })
示例:
public class Consumer {
public void consume(String str) {
System.out.println("INFO:" + str);
}
}
@SpringBootApplication
@Import(Consumer.class)
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
@SpringBootTest(classes = ProducerApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ConsumerTest {
@Autowired
private Consumer consumer;
@Test
public void consume() {
consumer.consume("CONSUME");
}
}
2.2 implements ImportSelector
實現(xiàn)ImportSelector接口裤唠,返回值是導入到容器中的組件全類名砂客。
示例:
public class ConsumerImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.zhao.service.Consumer"};
}
}
@SpringBootApplication
@Import(ConsumerImportSelector.class)
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
2.3 implements ImportBeanDefinitionRegistrar
實現(xiàn)ImportBeanDefinitionRegistrar接口泥张,在方法內(nèi)進行bean注冊。
示例:
public class ConsumerRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//定義bean
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Consumer.class);
//注冊bean
registry.registerBeanDefinition("consumer", rootBeanDefinition);
}
}
@SpringBootApplication
@Import(ConsumerRegistrar.class)
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}