Spring中@Import注解的使用
Spring中@Import注解的使用
@Import
注解算是SpringBoot自动配置原理中一个很重要的注解
认识@Import注解
先看一下源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
@Import
表示要导入的一个或多个@Configuration类
看注释value通常是一个普通的组件,Configuration
,ImportSelector
,ImportBeanDefinitionRegistrar
。
搭建项目结构用于测试
- 先创建一个maven工程
- 加入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
</dependencies>
- 编写测试代码
Tom.java
@Data
public class Tom {
private String color;
private Integer age;
}
AppConfig.java
@Configuration
public class AppConfig {
}
App.java
public class App {
public static void main(String[] args) {
// 创建容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取bean
Tom tom = context.getBean(Tom.class);
System.out.println(tom);
}
}
@Import用法
第一种普通组件
@Import
({ 要导入的容器中的组件 } )
CustomConfiguration.java
@Configuration
public class CustomConfiguration {
@Bean
public Tom tom() {
Tom tom = new Tom();
tom.setAge(11);
tom.setColor("红色");
return tom;
}
}
将AppConfig.java加上@Import({ CustomConfiguration.class })
@Import({ CustomConfiguration.class })
@Configuration
public class AppConfig {
}
这个时候运行App已经可以获取到Tom
第二种ImportSelector
CustomSelector.java
public class CustomSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] { "com.moli.pojo.Tom" };
}
}
将AppConfig.java加上@Import({ CustomRegistrar.class })
@Import({ CustomRegistrar.class })
@Configuration
public class AppConfig {
}
这个时候运行App已经可以获取到Tom
第三种ImportBeanDefinitionRegistrar
CustomRegistrar.java
public class CustomRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Tom.class);
builder.setScope(BeanDefinition.SCOPE_SINGLETON);
builder.addPropertyValue("color", "灰色");
builder.addPropertyValue("age", "12");
registry.registerBeanDefinition("tom", builder.getBeanDefinition());
}
}
将AppConfig.java加上@Import({ CustomSelector.class })
@Import({ CustomSelector.class })
@Configuration
public class AppConfig {
}
这个时候运行App已经可以获取到Tom
最佳搭档 - @Import通用形式
在开源软件中大部分@Import
中是伴随着一个@EnableXXX
使用的
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ CustomRegistrar.class })
public @interface EnableTom {
}
将AppConfig.java加上@EnableTom
@EnableTom
@Configuration
public class AppConfig {
}
这样看起来,是不是有那味了。
其实SpringBoot的自动配置就是@Import的一个应用
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
总结
直白一点使用
@Import
注解可以快速把实例加入Spring的IOC容器中
其实这三种用法也算是一种用法,就是导入一个类到容器,容器根据类的注解类型等信息对不同类进行不同处理;
方法一就是导入一个Tom实例Bean;
方法二CustomSelector
返回的类的全限定类名,实际上要导入到容器中的组件全类名;
方法三ImportBeanDefinitionRegistrar
类似于第二种ImportSelector
用法,只不过这种用法能自定义化注册,往容器内注入一个BeanDefinition
,然后BeanDeiniton
在容器内转为一个实例bean;
Spring中@Import注解的使用的更多相关文章
- EnableAutoConfiguration注解 Spring中@Import注解的作用和使用
EnableAutoConfiguration注解 http://www.51gjie.com/javaweb/1046.html springboot@EnableAutoConfiguration ...
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <面试必杀技,讲一讲Spring中的循环依赖> 然后,很多同学碰到了下面这个问题,添加了S ...
- Spring中@Autowired注解、@Resource注解的区别 (zz)
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
- Spring中Value注解的使用
Spring中Value注解的使用 分类: Spring2014-08-16 17:28 2985人阅读 评论(0) 收藏 举报 有的时候我们定义了Properties文件,并且使用Spring的Pr ...
- 全面解析Spring中@ModelAttribute注解的用法
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...
- Spring中常用注解的介绍
spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...
- Spring中使用注解时启用<context:component-scan/>
在spring中使用注解方式时需要在spring配置文件中配置组件扫描器:http://blog.csdn.net/j080624/article/details/56277315 <conte ...
- Spring中常用注解
1.@Component 创建类对象,相当于配置<bean/> 2.@Service @Service与@Component功能相同,写在ServiceImpl类上 3.@Reposito ...
- 【进阶】Spring中的注解与反射
[进阶]Spring中的注解与反射 目录 [进阶]Spring中的注解与反射 前言 一.内置(常用)注解 1.1@Overrode 1.2@RequestMapping 1.3@RequestBody ...
随机推荐
- Java视频教程免费分享(网盘直接取)
Java基础 Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java刘意:链接:https://pan.baidu.com/s/1kVZQCqr ...
- HDU_3949 XOR 【线性基】
一.题目 XOR 二.分析 给定$N$个数,问它的任意子集异或产生的数进行排列,求第K小的数. 构造出线性基$B$后,如果$|B| < N$,那么代表N个数中有一个数是可以由线性基中的其他数异或 ...
- 记一次scrapy-redis爬取小说网的分布式搭建过程
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 可以启动多个spider工程,相 ...
- 安全计算环境之剩余信息保护-windows
参考https://blog.csdn.net/ubjewen/article/details/107587951 应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除 交互式登录: 之前登录到 ...
- 1-认识c指针
1.指针和内存 c程序在编译后,会以三种形式使用内存 1静态/全局内存 静态声明的变量分配在这里,全局变量也使用这部分内存.这些变量在程序开始运行时分配,直到程序终止时才会消失 2.自动内存 这些变量 ...
- [Design Pattern With Go]设计模式-单例模式
定义 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式.当某些数据只需要在系统中保留一份的时候,可以选择使用单例模式. 饿汉式 饿汉式的实现方式比较简单.在类加 ...
- 学习笔记-json数据格式化
标准的json : let result=[{"a": 'aa', "b": 'aa', "c": 'aa'}, {"a" ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作ubuntu16.04-16
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作ubuntu16.04-16 欢迎加QQ群:1026880196 进行交流学习 制作Ope ...
- 2. linux下如何上传和下载文件
一. 安装工具包 yum install -y lrzsz lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux 系统之间的文件传输,体积小速度 ...
- seaweedfs分布式文件使用示例
安装seaweedfs分布式文件存储 启动一个测试集群:2 filer(8801-8802) + 3 master(9331-9333) + 3 volume(8081-8083) 下载seaweed ...