文章目录

  • 1. @Import 作用
  • 2. 方式一:@Import 直接导入
  • 3. 方式二:ImportSelector 接口
  • 4. 方式三:ImportBeanDefinitionRegistrar 接口

1. @Import 作用

将Bean实例加入IOC容器管理,常见的有以下几种方式:

  • @Controller、@Service、@Repository、@Component、@Configuration 标记的类,并且被扫描到
  • @Bean,导入的第三方包里的组件
  • @Import,快速给容器导入一个组件

其中,@Import 导入组件也有以下三种方式

2. 方式一:@Import 直接导入

先来看个例子,当前有两个类A和B。 A没有加@Component因此不会加入Spring容器,B类会加入Spring容器,并且自动注入属性a。

public class A {public A(){System.out.println("调用A构造函数");}
}
@Component
public class B {@Autowiredprivate A a;public B(){System.out.println("调用B构造函数");}
}

此时启动程序,抛出 NoSuchBeanDefinitionException,原因是Spring容器内部找不到Bean A

如果我们希望在使用B类的时候再将A类注入容器,而不是一开始就通过@Component注入。name,@Import就派上用场了。修改class B代码,加上@Import试试

@Component
@Import(A.class)
public class B {@Autowiredprivate A a;public B(){System.out.println("调用B构造函数");}
}

重新启动程序,运行正常:

3. 方式二:ImportSelector 接口

定义一个类 MyImportSelector 实现 ImportSelector 接口,当前接口只有一个方法 selectImports。

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {System.out.println("执行MyImportSelector");return new String[]{ A.class.getName() };}
}

然后修改B类,@Import改成导入 MyImportSelector.class

@Component
@Import({MyImportSelector.class})
public class B {@Autowiredprivate A a;public B(){System.out.println("调用B构造函数");}
}

运行结果如下:

4. 方式三:ImportBeanDefinitionRegistrar 接口

该方法和方式二基本类似,也是通过实现接口方法自定义注入 Bean。

创建 MyImportBeanDefinitionRegistrar,实现 ImportBeanDefinitionRegistrar 接口

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {System.out.println("执行 MyImportBeanDefinitionRegistrar");RootBeanDefinition beanDefinition = new RootBeanDefinition(A.class);registry.registerBeanDefinition("A", beanDefinition);}
}

然后修改B类的 @Import 如下:

@Component
@Import({MyImportBeanDefinitionRegistrar.class})
public class B {@Autowiredprivate A a;public B(){System.out.println("调用B构造函数");}
}

运行后,输出结果如下:

Spring @Import 注解使用详解相关推荐

  1. java spring框架 注解_详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的类的实现: class UserManagerImpl implements UserManager { private ...

  2. spring @Transactional注解参数详解

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: @Transactional public class TestServiceBean imp ...

  3. Spring(注解)详解

    一.Spring 什么是bean? Bean :在计算机英语中,有可重用组件的含义 什么是JavaBean? JavaBean : 用java语言编写的可重用组件 什么是可重用组件? 这里我们拿Spr ...

  4. Spring 注解@Value详解

    一.spring(基础10) 注解@Value详解[1] 一 配置方式 @value需要参数,这里参数可以是两种形式: [html] view plaincopy @Value("#{con ...

  5. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  6. Spring 3.0 注解注入详解

    Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...

  7. spring MVC请求处理类注解属性详解

    spring MVC请求处理类注解属性详解

  8. Spring和WebSocket整合详解

    Spring和WebSocket整合详解 本篇编写日期较早,代码冗余较多,新博文:Spring和WebSocket整合并建立简单的Web聊天室 官方主页 Spring WebSocket 概述 Web ...

  9. Spring和Ehcache整合详解

    Spring和Ehcache整合详解 一.官方主页 Spring Cache 二.概述 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点. Spring 提供了对缓存功能的抽象: ...

最新文章

  1. go语言中的类型转换
  2. It's Time to Say Goodbye (此刻告别)
  3. hive查询where join_Hive系列(4):常用函数where,join
  4. PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程(转)
  5. 推荐系统里,你是怎么Embedding的?
  6. oracle 如何数组变成表,Oracle从零开始19——表的管理09——嵌套表和可变数组
  7. 118. Pascal's Triangle
  8. virtualenv模块使用
  9. SQ小组KTV点歌系统简介
  10. 实战项目| 7天掌握神经网络预测模型
  11. git 删除本地仓库
  12. 学音视频一定要掌握这几个算法
  13. tkinter使用cefpython库_Python3.7 tkinter中嵌入网页(WebView),需要引入cefpython3
  14. 数据集 oracle,Analytics 数据集 - Oracle® ZFS Storage Appliance RESTful API 指南,发行版 OS8.6.0...
  15. SQL Server 2008数据库快照技术(八)
  16. 计算机无法锁定在任务栏,win10系统无法锁定任务栏的处理办法
  17. Codeforces Round #609 (Div. 2) C. Long Beautiful Integer
  18. VMware扩展Ubuntu分区容量大小
  19. 微信接入探秘(五)——万事俱备,只欠架构(API篇)
  20. PAT甲级 1016 Phone Bills(时间差)

热门文章

  1. 修改SAPSR3密码
  2. Message LongText(消息的详细长文本)
  3. 大洋洲群狼来了! 这是中国篮球学习契机?
  4. SAP收货时自动创建采购订单
  5. POPUP_TO_DECIDE_WITH_MESSAGE
  6. LIST-PROCESSING命令的使用
  7. 全民学英语,VIPKID、51Talk、伴鱼、阿卡索们还好做么?
  8. 互联网业务利润增长3倍,TCL电子走出第二增长曲线
  9. MySQL高可靠_MySQL高可用与高可靠架构
  10. python 视频转场_视频剪辑什么鬼?Python 带你高效创作短视频