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:是企业级 ...
随机推荐
- 【.NET必读】RabbitMQ 4.0+重大变更!C#开发者必须掌握的6大升级要点
RabbitMQ 作为一款广受欢迎的消息队列中间件,近年来从 3.x 版本升级到 4.0+,带来了显著的功能增强和架构调整.与此同时,其官方 C# 客户端也从 6.x 版本跃升至 7.0,引入了全新的 ...
- linux安装node.js教程
我们使用包管理器安装,非常方便. 先看看有哪些版本: dnf module list nodejs 目前最新的是14,那就装14好了: dnf module install nodejs:14 要装啥 ...
- Qt项目转Visual Studio项目
有时觉得在Qt中调试代码不够方便,无法调试更深层次的参数,故需要将Qt项目转为Visual Studio项目. 方法:qmake -tp vc Hello.pro 以上命令会将名为Hello的Qt工程 ...
- java springboot图片上传和访问
上传 @RequestMapping("/uploadImg") public Result uploadImg(HttpServletRequest request, Multi ...
- 导航栏激活态下划线效果的CSS实现
一.鼠标移入效果图如下: 二.div结构 <div class="navbar"> <ul> <li>首页</li> </ul ...
- pip安装模块提示Command "python setup.py egg_info" failed with error code 1
报错详情: [root@k8s001 ~]# pip install kubernetes Collecting kubernetes Using cached https://files.pytho ...
- vue中使用axios获取到的Promise {<pending>}数据,无法使用的问题
使用axios拿到后端数据后 返回的是 Promise {} 我们可以看到数据是在[[PromiseResult]]这个Object对象中 此时我们是无法获取对象的 解决方法:使用async和awai ...
- MYSQL安装和版本选择(centos9作为样例)
下载 mysql下载地址:https://dev.mysql.com/downloads/mysql/ 系统版本选择 进入后如图,需要选择版本与系统版本 selectVersion:选择版本 mysq ...
- 国产自研、安全、高可用——袋鼠云大数据基础平台EasyMR筑基企业数字化转型
近年来,国际形势的风云变幻,中美双边关系的恶化,自2013年"棱镜门"事件之后,又一次警示国人,对于科技领域,只有自己掌握核心关键技术,实现自主可控,才能摆脱越来越频繁的" ...
- 【公开课】芯片ATE测试—93K机台与Smartest软件介绍
当前,随着中国集成电路产业的高速发展,芯片测试作为确保产品良率与可靠性的关键环节,其技术人才缺口日益凸显.尤其在测试设备操作层面,行业普遍面临两大痛点: 一方面,高端ATE测试平台(如93K系统)操作 ...