SpringBoot中的@import注解
- @Import注解
Springboot的自动配置依赖于主配置类中的EnableAutoConfguration注解,而该注解的底层依赖的就是@Import这个注解
Enable*底层会使用@Import注解导入一些类,使用@Import注解导入的类会自动加载进SpringIOC容器中
@Import中共提供4中方式:
- 方式一:直接导入Bean
package com.itheima.springbootenable;
import com.itheima.domain.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.Map;
@SpringBootApplication
//1.@ComponentScan("com.itheima.config")
//2.@Import(UserConfig.class)
//@EnableUserAnnotion
@Import(User.class) //Impot的第一种用法,直接导入Bean
public class SpringbootEnableApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
/*Object object = run.getBean("user");
System.out.println(object);*/
User bean = run.getBean(User.class);
Map beansOfType = run.getBeansOfType(User.class);
System.out.println(bean.getName());
System.out.println(beansOfType);
}
}
- 方式二:直接导入配置类
package com.itheima.springbootenable;
import com.itheima.config.UserConfig;
import com.itheima.domain.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.Map;
@SpringBootApplication
//1.@ComponentScan("com.itheima.config")
//2.@Import(UserConfig.class)
//@EnableUserAnnotion
@Import(UserConfig.class) //第二种:直接导入User的配置类
public class SpringbootEnableApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
/*Object object = run.getBean("user");
System.out.println(object);*/
User bean = run.getBean(User.class);
Map beansOfType = run.getBeansOfType(User.class);
System.out.println(bean.getName());
System.out.println(beansOfType);
}
}
方式三:导入ImportSelector接口的实现类,
该方式是Spingboot中@Import注解默认使用的方式
//在springboot-other中声明一个实现类用来实现importselector这个接口, 该实现类与User在同一个项目中
package com.itheima.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//return new String[0];
return new String[]{"com.itheima.domain.User"};
}
}
//另外一个模块springboot-enable中的主配置类中要使用这个User
package com.itheima.springbootenable;
import com.itheima.config.MyImportSelector;
import com.itheima.domain.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.Map;
@SpringBootApplication
//1.@ComponentScan("com.itheima.config")
//2.@Import(UserConfig.class)
//@EnableUserAnnotion
//1. @Import(User.class)
//2. @Import(UserConfig.class)
@Import(MyImportSelector.class) //第三种:引入importselector接口的实现类
public class SpringbootEnableApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
/*Object object = run.getBean("user");
System.out.println(object);*/
User bean = run.getBean(User.class);
Map beansOfType = run.getBeansOfType(User.class);
System.out.println(bean.getName());
System.out.println(beansOfType);
}
}
- 方式四:创建ImportBeanDefinitionRegisterar这个接口的实现类
该方式暂不展示了
针对第三种方式跟一下Springboot源码,解析:
//1.进入SpringbootApplication这个注解
@SpringBootApplication
//2.该注解下有三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan()
//3.跟踪EnableAutoConfiguration这个注解,该注解中有:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
//4.Import这个注解使用的是引入ImportSelector实现类这个方式
具体实现方式在@EnableAutoConfiguration这个注解中进行说明,关注博客中的Springboot的@EnableAutoConfiguration注解