Springboot 注解大全-@Import

作用

@Import可以用来批量导入需要注册的各种类,如普通的类、配置类,完成普通类和配置类中所有bean注册到spring容器中。
作用范围:作用于类、注解

定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    /**
     * {@link Configuration @Configuration}, {@link ImportSelector},
     * {@link ImportBeanDefinitionRegistrar}, or regular component classes to
import. */
    Class<?>[] value();
}

参数


value:一个Class数组,设置需要导入的类,可以是@Configuration标注的类,也可以是需要导入的普通组件类。

使用

1、导入普通类

@Service
public class UserService {
}
public class UserService2 {
}
@Import({UserService2.class}) //导入了UserService2这个普通类。这个类会被自动注册到spring容器中
@Configuration
public class UserConfig {

}
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        for(String beanName : run.getBeanDefinitionNames()){
            System.out.println(beanName);
        }
    }
}

运行输出:

userService
com.example.demo.service.UserService2

从输出中可以看出UserService2注入到容器中,UserService2注入容器中名称为完整的类名。

2、导入@Configuration配置类

@Import用于@Configuration配置类,通常在一个项目中有多个模块,而需要在一个模块中引入其它模块的配置类进行使用的情况,如下:

@Configuration
public class ImportConfig {
}
@Import({ImportConfig.class})
@Configuration
public class UserConfig {

}

运行输出:

userService
moduleOne.ImportConfig

从输出中可以看moduleOne模块中的ImportConfig类被注入到了Spring容器中。

3、导入@CompontentScan标注的类

在一个项目中可以划分为多个模块,每个模块都是各自独立的包,我们在每个模块所在的包中配置一个@CompontentScan类,然后通过@Import来导入需要启用的模块。
模块一

@Component
public class OneService {
}
@ComponentScan
public class OneConfigure {
}

模块二

@Import({OneConfigure.class})  //此处引入了模块一当中的OneConfigure类,这是一个被@ComponentScan标注的扫描类
@Configuration
public class UserConfig {

}
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        for(String beanName : run.getBeanDefinitionNames()){
            System.out.println(beanName);
        }
    }
}

运行部分结果输出:

oneApplication
oneService

从上面输出结果可以看出,OneService这个bean被注入到了Spring容器中。

4、导入ImportSelector接口类型

ImportSelector接口只定义了一个selectImports()方法,用于指定需要注册为bean的Class名称。
使用方法:

  1. 定义ImportSelector接口实现类,在selectImports返回需要导入的类的名称数组
  2. 使用@Import来导入步骤1中定义的类
  3. 使用步骤2中@Import标的类作为AnnotationConfigApplicationContext构造参数创建Spring容器
  4. 使用AnnotationConfigApplicationContext操作bean

public class SelectService {
}
@Configuration
public class SelectConfig {
@Bean
public String hello(){
    return "Hello";
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    return new String[]{
            SelectService.class.getName(),
            SelectConfig.class.getName()
    };
}
}
@Import({MyImportSelector.class})
public class ImportSelectorConfig {
}

运行测试

@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
    ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
    for(String beanName : run.getBeanDefinitionNames()){
        System.out.println(beanName);
    }
}
}

运行输出

com.example.demo.service.SelectService
hello
world

从输出中可以看到,SelectService与SelectConfig两个Bean都注入到了Spring容器中。

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/85

Previous 2022年8月3日
Next 2022年9月1日

相关推荐

  • SpringBoot 定时器

    spring提供了@Scheduled和@EnableScheduling两个注解用来快速开发定时器,使用很简单 用法: 1、Springboot的启动类中加上@EnableSch…

    springboot 2023年4月23日
    136
  • SpringBoot 整合SpringSecurity认证

    简介 Spring Security 是Spring家族中的一个安全管理框架。相比与另外一个安全框架shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 —般Web应用的…

    2023年12月31日
    424
  • SpringBoot 整合Druid数据源

    简介 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能。 优点 引入依赖 这里使用的是SpringBoot整合版的Dru…

    2023年3月26日
    169
  • SpringBoot 缓存 – Redis

    引入依赖 缓存配置 启用缓存 修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下: 配置缓存类 新建Redis缓存配置类RedisConfig,如下: 添加缓…

    2023年4月23日
    161
  • SpringBoot 分布式Session

    简介 现在随着分布式,微服务架构的日益成熟,越来越多的企业将传统的单体服务改造为微服务或是分布式架构,在分布式中就遇到session管理的问题,微服务架构中一个服务为了实现高可用至…

    springboot 2023年4月30日
    177
  • SpringBoot 缓存 – jetcache

    简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和强大的注解来简化缓存的使用。原生支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操…

    springboot 2023年4月23日
    337
  • SpringBoot 整合Mybatis-Plus

    简介 MyBatis-Plus是一个MyBatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发,提高效率而生。 添加依赖 注意:添加Mybatis-Plus即可…

    springboot 2023年3月26日
    131
  • SpringBoot 过滤器

    简介 SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。 使用场景 Spring…

    springboot 2023年4月30日
    242
  • SpringBoot 打包

    SpringBoot 项目部署到服务器常见的方式就是,打包成 jar 包,通过 nohup java -jar 命令去运行项目,这也是官方推荐的一种方式。 导入依赖 打包 设置打包…

    springboot 2023年4月5日
    149
  • SpringBoot 全局异常统一处理

    前言 在实际的项目开发过程中,会有大量的异常发生,而我们并不能将异常信息反馈到用户,所以在返回结果的时候需要对异常进行处理,可是如果在每个Controller返回结果都需要进行异常…

    springboot 2023年4月29日
    126