Springboot2注解@Import的使⽤
@Import可以导⼊bean或者@Configuration修饰的配置类。如果配置类在标准的springboot的包结构下,就是SpringbootApplication启动类在包的根⽬录下,配置类在⼦包下。就不需要使⽤@Import导⼊配置类,如果配置类在第三⽅的jar下,我们想要引⼊这个配置类,就需要@Import对其引⼊到⼯程中才能⽣效。因为这个时候配置类不再springboot默认的扫描范围内。
另外,@Import相当于Spring xml配置⽂件中的<import />标签。
下⾯就看⼀看@Import的⼏种⽤法:
使⽤⽅法⼀:导⼊普通类
1.1 把普通的类⽤@Import导⼊之后成为⼀个bean。这个类并未使⽤@Service、@Component将其创建为bean。
@Getter
@Setter
public class MySqlConn {
private String driverClass = "xxxx";
private String url = "jdbc:mysql://localhost:3306/mydb";
private String userName = "root";
private String password = "root";
}
1.2 在springboot的启动类@Import这个类,这个类就可以被其他类当做bean来引⽤。
@SpringBootApplication
@Import({MySqlConn.class})
public class SpringBootApplication1 {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication1.class, args);
}
}
1.3 测试,定义⼀个controller来测试,调⽤这个通过@Import⽅式导⼊的bean
@RestController
@RequestMapping("test")
public class RestTestController {
@Autowired
private MySqlConn mySqlConn;
@GetMapping("common")
public String commonBean() {
String jsonResult = "";
ObjectMapper mapper = new ObjectMapper();
try {
jsonResult = mapper.writeValueAsString(mySqlConn);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResult;
}
}
使⽤⽅法⼆:和@Configuration搭配使⽤
@Import被⽤来整合@Configuration注解中定义的bean配置。
2.1 定义⼀个配置类@Configuration,配置类中定义了⼀些bean。下⾯的代码中可以看到我们定义的bean是MySqlServerBean。
@Configuration
public class MySqlConfig {
@Bean
public MySqlServerBean getBean() {
MySqlServerBean bean = new MySqlServerBean();
bean.setUserName("lyj");
return bean;
}
}
2.2 在启动类中@import这个配置类:
@SpringBootApplication
@Import(MySqlConfig.class)
public class SpringBootApplication3 {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication3.class, args);
}
}
2.3 测试,定义⼀个controller,我们看到在controller中就可以直接使⽤在MySqlConfig中定义MySqlServerBean了。@RestController
@RequestMapping("test")
public class RestTestController {
@Autowired
private MySqlServerBean mySqlServerBean;
@GetMapping("mysql")
public String mysql() {
String jsonResult = "";
ObjectMapper mapper = new ObjectMapper();
try {
jsonResult = mapper.writeValueAsString(mySqlServerBean);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResult;
}
}
使⽤⽅法三:在配置类上导⼊
在配置类上通过@Import直接导⼊类,也可以被引⽤成bean。
3.1 定义⼀个普通的类
@Getter
@Setter
public class PoolBean {
private String redisHost = "127.0.0.1";
private String redisPort = "6379";
private String redisDb = "0";
}
3.2 在配置类上导⼊这个类
@Configuration
@Import({PoolBean.class})
public class RedisConfig {
@Bean
public RedisClusterBean getHost() {
return new RedisClusterBean();
}
}
3.3 测试,启动项⽬,在controller直接引⽤这个PoolBean。
@SpringBootApplication
public class SpringBootApplication2 {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication2.class, args);
}
}
@RestController
@RequestMapping("test")
public class RestTestController {
@Autowired
private PoolBean poolBean;
@GetMapping("pool")
public String poolBean() {
String jsonResult = "";
ObjectMapper mapper = new ObjectMapper();
try {
jsonResult = mapper.writeValueAsString(poolBean);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResult;
}
}
使⽤⽅法四:和ImportSelector搭配使⽤
新建⼀个Maven⼯程,l的类型是jar,我们写⼀个第三⽅的jar包,⽤来引⽤到我们的主⼯程中,进⾏ImportSelector的⽰例使⽤。⼯程结构⼤概如下图:
4.1 在third-part功能中,我们先定义⼀个config
@Configuration
public class AppConfig {
@Bean
public Student studentBean() {
Student student = new Student();
student.setId(10);
student.setName("王某");
return student;
springboot结构}
}
4.2 ⾃定义⼀个SpringStartSelector实现接⼝ImportSelector,BeanFactoryAware。重写selectImports()
⽅法和setBeanFactory()⽅法。这⾥在程序启动的时候会先运⾏setBeanFactory()⽅法,我们可以在这⾥获取到beanFactory。selectImports()⽅法回了了AppCoinfig的全类名。public class SpringStartSelector implements ImportSelector, BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println("importingClassMetaData:" + importingClassMetadata);
System.out.println("beanFactory:" + beanFactory);
return new String[]{Name()};
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
4.3 ⾃定义⼀个注解EnableSpringStudy,在这个注解使⽤@Import()导⼊4.2中⾃定义的SpringStartSelector
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(SpringStartSelector.class)
public @interface EnableSpringStudy {
}
4.4 完成之后我们把 third-part项⽬打成jar包,在的pom⽂件中引⼊
<dependency>
<groupId>com.win.world</groupId>
<artifactId>third-part</artifactId>
<version>1.0.0</version>
</dependency>
4.5 主项⽬中在SpringBoot的启动类上使⽤我们4.3中⾃定义的注解。然后测试我们能否获取到AppConig中的bean。
@SpringBootApplication
@EnableSpringStudy
public class SpringBootApplication4 {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication4.class, args);
}
}
测试能否获取到AppConfig中的bean
@RestController
@RequestMapping("test")
public class RestTestController {
@Autowired
private Student student;
@GetMapping("selector")
public String selector() {
String jsonResult = "";
ObjectMapper mapper = new ObjectMapper();
try {
jsonResult = mapper.writeValueAsString(student);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResult;
}
}
使⽤⽅法五:和ImportBeanDefinitionRegistrar搭配使⽤
ImportBeanDefinitionRegistrar接⼝也是Spring的扩展点之⼀,它可以⽀持我们⾃⼰写的代码封装成Be
anDefinition对象;实现此接⼝的类回调postProcessBeanDefinitionRegistry⽅法,注册到Spring容器中。把bean注⼊到Spring容器不⽌有@Service @Component等注解⽅式,还可以实现此接⼝。下⾯看个例⼦:
5.1 我们先定义⼀个MyImportBeanDefinitionRegistrar类实现ImportBeanDefinitionRegistrar接⼝,并通过重写registerBeanDefinitions()来定义⼀个bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(Name());
MutablePropertyValues property = PropertyValues();
property.addPropertyValue("redisHost", "localhost");
property.addPropertyValue("redisPort", "6377");
//这⾥注册bean
}
}
5.2 定义⼀个配置类,@Import导⼊5.1的⾃定义类
@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class RegistrarConfig {
}
5.3 启动项⽬并测试⾃⼰在registerBeanDefinitions()⽅法中创建的bean PoolBean是否成功
@SpringBootApplication
public class SpringBootApplication5 {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication5.class, args);
}
}
@RestController
@RequestMapping("test")
public class RestTestController {
@Autowired
private PoolBean poolBean;
@GetMapping("registrar")
public String registrarTest() {
String jsonResult = "";
ObjectMapper mapper = new ObjectMapper();
try {
jsonResult = mapper.writeValueAsString(poolBean);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResult;
}
}
参考:
  【1】Spring框架中@Import注解,
  【2】@Import注解--导⼊资源,
  【3】⼀分钟学会Spring注解之@Import注解,
【4】@Import、ImportSelector注解使⽤及源码分析,【5】深⼊理解Spring的ImportSelector接⼝,
  【6】ImportBeanDefinitionRegistrar,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。