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 ...
随机推荐
- 浅析MyBatis(二):手写一个自己的MyBatis简单框架
在上一篇文章中,我们由一个快速案例剖析了 MyBatis 的整体架构与整体运行流程,在本篇文章中笔者会根据 MyBatis 的运行流程手写一个自定义 MyBatis 简单框架,在实践中加深对 MyBa ...
- 92反转链表II
# Definition for singly-linked list.# 这道题还是有点复杂的,但是是有套路的,套用反转链表的想法class ListNode: def __init__(self, ...
- 干掉前端!3分钟纯 Java 注解搭个管理系统
大家好,我是小富~ 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护 ...
- Java 并发工具类 CountDownLatch、CyclicBarrier、Semaphore、Exchanger
本文部分摘自<Java 并发编程的艺术> CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作.假设现有一个需求:我们需要解析一个 Excel ...
- 一文彻底搞懂JS前端5大模块化规范及其区别
码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14577243.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...
- nginx提供网站首页的一个实例
如果既想匹配'/'进行反向代理,同时又想通过nginx提供网站首页,可以在server中进行如下配置: user python; # 运行Nginx的用户 worker_processes auto; ...
- Python数据分析入门(六):Pandas的函数应用
apply和applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) p ...
- MongoDB教程--配置与入门
MongoDB简介 阿里云配置MongoDB 数据库的增删查改 MongoDB 数据最重要的操作是Key-Value的映射.有了这样的映射,可以直接通过关键字去寻找想要的值.例如,通过用户的ID寻找与 ...
- [深搜]C. 【例题3】虫食算
C . [ 例 题 3 ] 虫 食 算 题目解析 正解 : Dfs + 剪枝 依题意,把样例以加法的形式展现出来. 根据加法的性质,可以得出有两种情况:有进位和没有进位的. 而从百位到最高位的结果,又 ...
- 基于sinc的音频重采样(二):实现
上篇(基于sinc的音频重采样(一):原理)讲了基于sinc方法的重采样原理,并给出了数学表达式,如下: (1) 本文讲如何基于这个数学表达式来做软件实现.软件实现的 ...