Spring的@Import注解简单介绍
Spring的@Import注解
作用
- 将没有使用@Component注解的普通class加入到Spring容器, 由Spring管理
- 导入一个Configuration类(比如你想组合多个Java Config类到一个Java Config类, 或者你引入的第三方jar包中的Java Config类没在你SpringBoot程序的子包下, 即没有被扫描进Spring容器)
- 通过实现了ImportSelector接口的类, 导入多个class到Spring容器(SpringBoot的自动装配@EnableAutoConfiguration)
- 通过实现ImportBeanDefinitionRegistrar接口的方式(MyBatis整合Spring: MapperScannerRegistrar.java和@MapperScan注解)
示例
1. 将普通Class加入到Spring容器
普通class
没有使用@Component注解, 有一个实例方法.
/**
* 一个普通的class, 没有被打上{@link org.springframework.stereotype.Component}注解, 后续使用@Import导入到Spring容器
*
* @author rhyme
*/
@Slf4j
public class ClassWithoutComponentAnnotation {
public boolean methodA() {
log.info("ClassWithoutComponentAnnotation对象的**实例方法**methodA被调用");
return true;
}
}
2. @Import Java Config
将该类也和上面一样, 由@Import引入就行
@Configuration
public class ClassWithConfigurationAnnotation {
@Bean
public DemoClass demoClass() {
return new DemoClass();
}
}
3. 实现了ImportSelector接口的类, 导入多个class到Spring容器
实现了ImportSelector接口的类
/** @author rhyme */
public class ClassImplementsImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] {
"java.basic.demos.springannotation.Import.classimplementsimportselector.ClassA",
"java.basic.demos.springannotation.Import.classimplementsimportselector.ClassB"
};
}
}
各种@EnableXXX注解, 比如SpringBoot源码中的@EnableAutoConfiguration和@EnableCircuitBreaker
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
/**
* Annotation to enable a CircuitBreaker implementation.
* https://martinfowler.com/bliki/CircuitBreaker.html
* @author Spencer Gibb
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableCircuitBreakerImportSelector.class)
public @interface EnableCircuitBreaker {
}
4. 实现ImportBeanDefinitionRegistrar接口的方式
实现了ImportBeanDefinitionRegistrar接口, 注册自己的bean
/** @author rhyme */
public class ClassImplementImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition root = new RootBeanDefinition(ClassC.class);
registry.registerBeanDefinition("classC", root);
}
}
MyBatis整合Spring源码
/**
* A {@link ImportBeanDefinitionRegistrar} to allow annotation configuration of
* MyBatis mapper scanning. Using an @Enable annotation allows beans to be
* registered via @Component configuration, whereas implementing
* {@code BeanDefinitionRegistryPostProcessor} will work for XML configuration.
*
* @author Michael Lanyon
* @author Eduardo Macarron
*
* @see MapperFactoryBean
* @see ClassPathMapperScanner
* @since 1.2.0
*/
public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
public @interface MapperScan {
5. 使用@Import搭配@Configuration导入到Spring容器
/**
* @Import注解, 搭配@Configuration, 见ImportConfigTest.java<br>
* 1. 将没有使用@Component注解的普通class加入到Spring容器, 由Spring管理<br>
* 2. 导入一个Configuration类 <br>
* 3. 通过实现了ImportSelector接口的类, 导入多个class到Spring容器(**SpringBoot的自动装配@EnableAutoConfiguration**) <br>
* 4. 通过实现ImportBeanDefinitionRegistrar接口的方式(MyBatis整合Spring:MapperScannerRegistrar.java和@MapperScan注解)
*
* @author rhyme
*/
@Configuration
@Import({
ClassWithoutComponentAnnotation.class,
ClassWithConfigurationAnnotation.class,
ClassImplementsImportSelector.class,
ClassImplementImportBeanDefinitionRegistrar.class
})
public class ImportConfig {}
6. 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ImportConfigTest {
@Autowired private ClassWithoutComponentAnnotation classWithoutComponentAnnotation;
@Autowired private DemoClass demoClass;
@Autowired private ClassA classA;
@Autowired private ClassB classB;
@Autowired private ClassC classC;
/** 通过@Autowired获取@Import的类 */
@Test
public void importClass2SpringContainerTest() {
Assert.assertNotNull(classWithoutComponentAnnotation);
Assert.assertNotNull(demoClass);
Assert.assertNotNull(classA);
Assert.assertNotNull(classB);
Assert.assertNotNull(classC);
}
}
Spring的@Import注解简单介绍的更多相关文章
- EnableAutoConfiguration注解 Spring中@Import注解的作用和使用
EnableAutoConfiguration注解 http://www.51gjie.com/javaweb/1046.html springboot@EnableAutoConfiguration ...
- Spring中@Import注解的使用
Spring中@Import注解的使用 @Import注解算是SpringBoot自动配置原理中一个很重要的注解 认识@Import注解 先看一下源码 @Target(ElementType.TYPE ...
- Spring基于 Annotation 的简单介绍
tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial"> 1.使用 @ ...
- Spring中常用注解的介绍
spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...
- lombok 注解简单介绍
一.Lombok 的简单介绍和使用 Lombok是一个可以帮助我们简化 Java 代码编写的工具类,通过采用注解的方式简化了 JavaBean 的编写,使我们写的类更加简洁. 1. 添加 Lombok ...
- SpringWeb项目常用注解简单介绍
注解分为两类: 一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性.方法的组装:比如@Autowired , @Resource,可以通过byTYPE(@Autowired) ...
- Spring 配置log4j和简单介绍Log4J的使用
Log4j 是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事 件记录器.UNIX Syslog守护进程等 ...
- Spring history&Design Philosophy 简单介绍~
SPRING框架的介绍和历史 Spring Framework是一个开源Java应用程序框架,最初是基于依赖注入(DI)和控制反转(IoC)的原理开发的. Spring Framework已经成长为控 ...
- spring boot 之@JsonView 简单介绍
@JsonView是jackson json中的一个注解,spring webmvc也支持这个注解. 这个注解的作用就是控制输入输出后的json. 假设我们有一个用户类,其中包含用户名和密码,一般情况 ...
- Spring IOC模块的简单介绍
首先,本人正在学习spring,这是一点心得体会,所以本文中会有不足.错误之处,欢迎各位大佬进行指点. 其次对于框架而言,知道反射是很重要,所以建议在学会反射了后在去看看框架. Spring:是企业级 ...
随机推荐
- 面试官说又逮到一个不会用Git的
这里这写简要,要看具体的步骤及解释清移步:https://www.bilibili.com/read/cv10510952 如果是自己创建仓库写代码上传(demo是自己仓库的自定义名字): git i ...
- vue中使用swiper 插件出错问题
由于我自己在写一个demo时候用到了该插件,出现了一些问题,所以就简单查了一下该插件的用法以及一些常见的错误 1.出现Get .../maps/swiper.min.js.map 500(Intern ...
- WindowsPE文件格式入门06.手写最小PE
https://bpsend.net/thread-346-1-1.html 实现目标 实现目标:手写实现不大于 200 Byte大小的PE文件(又名:畸形PE/变形PE),要求MessageBox弹 ...
- 怒更一波TransDuck免费的声音克隆和AI配音功能
宝子们! 最近咱软件TransDuck的免费声音克隆和AI配音功能被大家用爆啦!感谢各位自来水疯狂安利!! DD这里也是收到好多用户提的宝贵建议!所以,连夜肝了波更新! 这次重点更新使用克隆音色进行A ...
- 远古python1.6 linux版下载
链接:https://www.123pan.com/s/qdY9-n3fk3 语法和python2应该是差不多的,曾经提到过 体验:
- 算法新手村 Day01
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 前言: 算法 算法的分类 几个排序算法 0.两值交换 1.选择排序 动图 思路 代码 2.冒泡排序 动图 思路 代码 3.插入排序 动图 思路 ...
- JS如何实现实时获取网络时间
首先我们列出常用的js获取网络时间的代码: getFullYear()获取年份 getMonth()获取月份[0-11] getDate()获取日 getHours()获取小时 getMinutes( ...
- Java编码小技巧
你在写一个方法的时候, 例如传入 两个数组,而你要写的方法代码块又恰好有一种判断方式会导致你要写两个相同代码块, 你就可以自己调用自己,并把传参顺序 换一下 public int[] intersec ...
- Tcode:PFAL说明
Short text HR: ALE Distribution of HR Master Data Description. Scenario 1: Distribution of HR Master ...
- 数栈技术分享:利用 Atomic 构建 React 项目工作流,so easy!
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...