@Bean 小知识
先说结论
@Bean 可以用在任意方法上。 -- 也可以用在注解上面。
@Bean 仅在Spring创建bean时起作用。
这应该算一个小技巧,在一个平常类(非@Configuration class)中@Bean method,需要的时候直接导入该类即可。
补充一句,@Import 在 4.2 版本之前只能导入配置类,4.2及以后可以导入任意类。
再来说说起因
在看Spring Boot源码的时候,发现很多平常类(非@Configuration class)中都有 @Bean method,甚是疑惑。
开始以为 Spring 会直接探测 @Bean method,然后创建相应的bean。于是手动测试了一番,代码如下(Spring Boot项目):
public class _TestBean {
@Bean(name = "joke")
public User user() {
User user = new User();
user.setName("joke");
return user;
}
}
@Configuration
public class _TestBeanConfig {
@Autowired
@Qualifier("joke")
private User joke;
@Autowired
private User user; @PostConstruct
public void print() {
System.out.println(joke);
System.out.println("---");
System.out.println(user);
} }
结果,启动失败,报错内容是user依赖不满足!
所以之前的推测明显不成立, Spring不会扫描平常类中的@Bean method。
再次尝试
模仿Spring Boot源码中的使用方式:@Import,
@Configuration
@Import(value = _TestBean.class)
public class _TestBeanConfig {
@Autowired
@Qualifier("joke")
private User joke;
@Autowired
private User user; @PostConstruct
public void print() {
System.out.println(joke);
System.out.println("---");
System.out.println(user);
} }
再次启动,成功,并顺利打印出所需信息。
就是说,使用@Import时,Spring会扫描被导入的类中的@Bean method,并执行(创建相应bean)。
查了下@Import,原文是这么说的:
Indicates one or more @Configuration classes to import.
又查了下@Configuration,说法如下:
Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime.
同时,@Configuration又被注解了@Component。
于是推测,Spring 在创建bean时,就会扫描其中的 @Bean method。
第三次测试如下:
@Component
public class _TestBean { @Bean(name = "joke")
public User user() {
User user = new User();
user.setName("joke");
return user;
}
}
@Configuration
// @Import(value = _TestBean.class)
public class _TestBeanConfig {
@Autowired
@Qualifier("joke")
private User joke;
@Autowired
private User user; @PostConstruct
public void print() {
System.out.println(joke);
System.out.println("---");
System.out.println(user);
} }
果然,顺利启动,并打印出所需信息。
于是得出最开始的结论:
@Bean 可以用在任意方法上。 -- 也可以用在注解上面。
@Bean 仅在Spring创建bean时起作用。
@Bean 小知识的更多相关文章
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
- iOS APP开发的小知识(分享)
亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...
- Unix系统小知识(转)
Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
- salesforce 零基础开发入门学习(十)IDE便捷小知识
在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...
- Jquery:小知识;
Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器 上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...
- HTML小知识---Label
今天知道了一个html小知识: <input type="checkbox" id="chkVersion" /> ...
- Unicode和汉字编码小知识
Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...
- Java异常的一个小知识
有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...
随机推荐
- Linux系统攻略 用UUID在Fstab中挂载分区
Fstab 文件大家都很熟悉,Linux 在启动的时候通过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样: /dev/sdb5 /mnt/usb vfat utf8,umask=0 0 ...
- 搭建nginx流媒体服务器(支持HLS)
环境搭建 (一)下载源代码 nginx,地址:http://nginx.org/可以选择需要的版本下载 nginx_mod_h264_streaming-2.2.7.tar.gz ,支持MP4流,具体 ...
- 算法笔记_045:币值最大化问题(Java)
目录 1 问题描述 2 解决方案 2.1 动态规划法 1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻 ...
- 将图片转成base64字符串并在JSP页面显示的Java代码
*本事例主要讲了如下几点: * 1:将图片转换为BASE64加密字符串. * 2:将图片流转换为BASE64加密字符串. * 3:将BASE64加密字符串转换为图片. * 4:在jsp文件中以引 ...
- 每日一Vim(1)
来自 上一篇讲过了Vim的基本操作命令(打开,编辑,保存退出)以及Vim的三种基本模式和光标的基本导航(hjkl),今天讲一些稍微高级点的光标移动,以及一些基本的文本操作命令. 翻一页/半页 对于一个 ...
- socket shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据 ...
- linux cut 命令
cut:以某种方式按照文件的行进行分割 参数列表: -b 按字节选取 忽略多字节字符边界,除非也指定了 -n 标志 -c 按字符选取 -d 自定义分隔符,默认为制表符. -f 与-d一起使用,指定显示 ...
- ssh-keygen - 生成、管理和转换认证密钥
通常使用:[b]ssh-keygen -i -f 公密匙名>> authorized_keys[/b]语法详细介绍[code]ssh-keygen [-q] [-b bits] -t ty ...
- Pytorch中的norm跟Numpy中的norm对比
- Android设计模式系列(1)--SDK源码之组合模式
Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...