springboot源码-@Import注解作用
参考网址:
https://mp.weixin.qq.com/s/xnELQmEiKsamoQ_EZ1cZRw
作用
- 导入普通类 , 搭配 @Configuration 注解使用
- ImportSelector 接口搭配使用
- ImportBeanDefinitonRegistrar 搭配使用
1.导入普通类
MyImportBean.java
public class MyImportBean {
public void hello(){
System.out.println("测试 import 导入 普通类");
}
}
MyImportConfiguration.java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
// 参数值是个数组 , 可以存放多个 javabean 到 spring 容器中
@Import({MyImportBean.class})
public class MyImportConfiguration {
}
启动类测试
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(SpringbootDemoApplication.class, args);
// 从 springboot 容器中 获取 MyImportBean.class 对象
MyImportBean myImportBean = ac.getBean(MyImportBean.class);
myImportBean.hello();
}
}
2.ImportSelector
MyImportSelectorBeanOne.java
public class MyImportSelectorBeanOne {
public void hello(){
System.out.println("MyImportSelectorBeanOne ---> hello 方法");
}
}
MyImportSelectorBeanTwo.java
public class MyImportSelectorBeanTwo {
public void hello(){
System.out.println("MyImportSelectorBeanTwo ---> hello 方法");
}
}
MyImportSelector.java
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.example.controller.importtest.MyImportSelectorBeanOne","com.example.controller.importtest.MyImportSelectorBeanTwo"};
}
}
MyImportSelectorConfiuration.java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(MyImportSelector.class)
public class MyImportSelectorConfiuration {
}
启动类测试
import com.example.controller.importtest.MyImportSelectorBeanOne;
import com.example.controller.importtest.MyImportSelectorBeanTwo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(SpringbootDemoApplication.class, args);
MyImportSelectorBeanOne myImportSelectorBeanOne = ac.getBean(MyImportSelectorBeanOne.class);
MyImportSelectorBeanTwo myImportSelectorBeanTwo = ac.getBean(MyImportSelectorBeanTwo.class);
myImportSelectorBeanOne.hello();
myImportSelectorBeanTwo.hello();
}
}
3.ImportBeanDefinitonRegistrar
MyImportBeanDefinitionRegistrarOne.java
public class MyImportBeanDefinitionRegistrarOne {
public void hello(){
System.out.println("MyImportBeanDefinitionRegistrarOne ---> hello");
}
}
MyImportBeanDefinitionRegistrarTwo.java
public class MyImportBeanDefinitionRegistrarTwo {
public void hello(){
System.out.println("MyImportBeanDefinitionRegistrarTwo ---> hello");
}
}
MyImportBeanDefinitionRegistrar.java
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition1 = new RootBeanDefinition();
RootBeanDefinition rootBeanDefinition2 = new RootBeanDefinition();
rootBeanDefinition1.setBeanClass(MyImportBeanDefinitionRegistrarOne.class);
rootBeanDefinition2.setBeanClass(MyImportBeanDefinitionRegistrarTwo.class);
registry.registerBeanDefinition("one",rootBeanDefinition1);
registry.registerBeanDefinition("two",rootBeanDefinition2);
}
}
MyImportBeanDefinitionRegistrarConfiuration.java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class MyImportBeanDefinitionRegistrarConfiuration {
}
启动类测试
import com.example.controller.importtest.MyImportBeanDefinitionRegistrarOne;
import com.example.controller.importtest.MyImportBeanDefinitionRegistrarTwo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(SpringbootDemoApplication.class, args);
MyImportBeanDefinitionRegistrarOne myImportBeanDefinitionRegistrarOne = (MyImportBeanDefinitionRegistrarOne) ac.getBean("one");
MyImportBeanDefinitionRegistrarTwo myImportBeanDefinitionRegistrarTwo = (MyImportBeanDefinitionRegistrarTwo) ac.getBean("two");
myImportBeanDefinitionRegistrarOne.hello();
myImportBeanDefinitionRegistrarTwo.hello();
}
}