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注解

总结: