SpringBoot--自动装配之Import注解以及源码分析
上期我们讲解SpringBoot中使用的Conditional注解以及在自动装配中是如何使用的,这期我们来讲一讲,SpringBoot中的Import注解、官方是如何使用的以及自动装配的源码解析。
一、Import注解
我们先来看一下这个注解的作用:使用@import导入的类都会被加载到ioc容器中
@Import的4种用法
- 导入Bean
- 导入配置类
- 导入ImportSelector实现类,一般用于加载配置文件中的类
- 导入ImportBeanDefinitionRegistrar实现类
下面我们来逐一演示
一、导入Bean、导入配置类(这两个很简单就放到一起演示了)
新建一个类叫User
public class User {
}
再建一个User的配置类UserConfig
public class UserConfig {@Beanpublic User getUser(){return new User();}
}
然后我们在引导类中添加一个@Import,导入我们刚刚写的UserConfig
@Import(UserConfig.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);// 根据类型获取相对应的对象User bean = context.getBean(User.class);System.out.println(bean);}
}
这时候启动项目就发现控制台输出了该对象
这时候可能就有人好奇了, Import中明明写的UserConfig, 我们却只获取了User,能不能获取UserConfig这个对象, 结果是可以的
@Import(UserConfig.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);// 根据类型获取相对应的对象User bean = context.getBean(User.class);UserConfig bean1 = context.getBean(UserConfig.class);System.out.println(bean);System.out.println(bean1);}
}
两者都能输出,并且能看到他们的路径, 这是因为被导入的UserConfig里面的方法将User放入了Ioc
所以当我们只用@import导入User.class时,是会显示报错信息的
意思是在容器中没有找到com.zhm.springboot.UserConfig类型的实例
导入UserConfig本质上就是导入配置类, 只是这个类上的@Configuration可以省略
二、导入ImportSelector实现类
我们先来看一下这个接口
定义了一个方法反悔了一个String[], 然后传参是注解元数据
那我们也定义一个类MyImportSelector来实现它,里面放入两个我们自定义的类的路径
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[]{"com.zhm.springboot.domain.User","com.zhm.springboot.domain.Student"};}
}
@Import(MyImportSelector.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);System.out.println(context.getBean(Student.class));System.out.println(context.getBean(User.class));}
}
启动项目也是成功的打印了
三、导入ImportBeanDefinitionRegistrar实现类
最后一种用法,我们先来看下这个接口
我们也自定义一个类来实现它
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(User.class);AbstractBeanDefinition definition = beanDefinitionBuilder.getBeanDefinition();registry.registerBeanDefinition("user",definition);}
}
引导类中我们进行这样的修改
@Import({MyImportBeanDefinitionRegistrar.class})
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);System.out.println(context.getBean(User.class));System.out.println(context.getBean("user"));}
}
看下启动项目的打印结果
这样写的好处就是可以自定义ioc中的bean的名称
二、SpringBoot的中使用
介绍完@import之后, 开始今天的重点, 跟踪一下springboot中自动装配的源码
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}
一切的源头都要从springboot 中的引导类开始说起
引导类中有两个重要的点
- run方法(加载流程)
- @SpringBootApplication (开启自动装配,包扫描,配置类)
第一点我们先不讲, 重点在@SpringbootApplication身上,我们点进去这个注解
被框出来的注解@EnableAutoConfiguration就是开启自动装配(其他的注解暂时先不介绍),我们继续点进去
被红框框中的就是我们上面一直在介绍的@Import, 可以很明显的看到使用的是第三种方法,导入ImportSelector的实现类,我们点进这个实现类继续看
可以看到它跟我们一样, 重写了selectImports这个方法, 返回的结果是一个String[], 有印象的朋友可能还记得我们@Import注解就是存的一个String[],我们点进红框中的方法继续看
红框中的方法返回就是一个类型为String的list,于是我们继续点进去
可以清晰的看到这边有一个断言, 写的就是 在META-INF/spring.factories中没有找到一条配置, 那也就是说我们的自动装配都放在了 META-INF/spring.factories中, 我们点进上面的loadFactoryNames方法
图中FACTORIES_RESOURCE_LOCATION常量的值正是
我们可以打下断点看下启动看下
图中可以看到总共获取了127条需要自动装配的信息, 那么这些路径从哪来的呢, 上一节讲到过了,就在autoconfigure中的路径
同理可得, 如果我们需要在自己的项目中需要自动装配一些配置, 我们只需要在本项目新建路径META-INF/spring.factories,并在文件中按照这样的写法就可以了
以上就是@import的运用以及springboot自动装配的流程
SpringBoot--自动装配之Import注解以及源码分析相关推荐
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转
SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...
- Spring Boot 基于注解驱动源码分析--自动配置
Spring作为Java开发最常用的容器管理框架,使用注解为我们提供很多便捷,下面通过源码分析Spring基于注解驱动自动配置的原理 首先介绍两个关键类: ConfigurationClassPost ...
- Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
http://moshowgame.iteye.com/blog/1607718 @Autowired自动装配 上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我们需 ...
- SpringBoot——错误处理机制 定制错误页面 (源码分析)
目录 一.错误处理机制 二.ErrorPageCustomizer 三.BasicErrorController 四.DefaultErrorViewResolver 五.如何定制错误响应页面 六.D ...
- Springboot源码分析第一弹 - 自动装配实现
Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...
- 【SpringBoot】Spring手动装配和SpringBoot自动装配
文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...
- Spring Ioc源码分析 之 Bean的加载(6):属性填充(populateBean())
"属性填充",也是在populateBean()方法中. 首先回顾下CreateBean的主流程: 如果是单例模式,从factoryBeanInstanceCache 缓存中获取B ...
- Apollo 2.0 框架及源码分析(一) | 软硬件框架
原文地址:https://zhuanlan.zhihu.com/p/33059132 前言 如引言中介绍的,这篇软硬件框架多为现有消息的整合加一些个人的想法.关于 Apollo 介绍的文章已经有许多, ...
- SpringBoot自动装配源码解析
Spring Boot 自动装配原理 使用Spring Boot最方便的一点体验在于我们可以几零配置的搭建一个Spring Web项目,那么他是怎么做到不通过配置来对Bean完成注入的呢.这就要归功于 ...
最新文章
- Debian/linux 安装配置ftp服务器
- openFeign 服务接口的调用02—— openFeign 的使用步骤
- php ole word,介绍 · PHPword新版开发指南 · 看云
- Struts2 之 ActionContext获取WEB资源
- 单元测试Struts2Spring项目的Action和Service(包含源码)
- s5pv210——中断实战
- Unreal Engine 4 字符串转换
- 键盘向上箭头代码中怎么表示_Altium Designer中的快捷键汇总(收藏必备)
- C++之父访谈录:我也没想到 C ++ 会这么成功!
- python实现GBDT算法的回归、二分类以及多分类,算法流程解读并可视化
- 阻止滑动事件_重温DOM事件流,捕获、冒泡、useCapture、passive
- jQuery Deferred对象
- 日常中的迅捷PDF转换器
- 一个中年SAP自由职业者的2020年终总结
- mac 更新系统后无法使用 git
- 帝国源码php安装文件是哪个,帝国CMS数据库配置文件是哪个文件?
- shell脚本之国际象棋棋盘
- MISC互相伤害!!!
- Ansible之ansible.cfg
- java门禁系统项目开发实现
热门文章
- 方正畅听 文字识别自动语音朗读软件
- html鼠标感应图片,jQuery实现的感应鼠标悬停图片色彩渐显效果
- php checkbox表单提交,HTML表单Checkbox的值如何正确提交到PHP后台?,需要技巧
- js时间格式化 YYYY/MM/DD HH:MM:SSS
- element-ui下拉框使用value绑定id
- element-ui按需引入
- java适合年龄_Java实现三人年龄
- 使用 JS 实现一个简单的日历
- tsv文件导oracle窜列,TSV(tsv文档怎么转换excel)
- 【codevs1116】四色问题