@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 ...
随机推荐
- 算法笔记_024:字符串的包含(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力轮询法 2.2 素数相乘法 2.3 位运算法 1 问题描述 给定一长字符串A和一短字符串B.请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A ...
- 在ubuntu下如何搜索文件?
来自 1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来.我一般的查找都用这条命令. ...
- 查看cache中消耗性能的语句
sqlserver服务器内存偏高,查看下cache中sql消耗情况! /* 查询cache中的语句 说明:可以根据类型.用户数.大小查询 */ ) declare @usecounts int dec ...
- ssh-keygen - 生成、管理和转换认证密钥
通常使用:[b]ssh-keygen -i -f 公密匙名>> authorized_keys[/b]语法详细介绍[code]ssh-keygen [-q] [-b bits] -t ty ...
- OFBiz:组件装入位置
默认的,OFBiz会在framework.applications.specialpurpose.hot-deploy这几个目录寻找组件,在themes目录中寻找主题.OFBiz是通过framewor ...
- 点滴记录——在Ubuntu 14.04中使SublimeText 3支持中文输入法
在Ubuntu 14.04中安装了SublimeText 3之后发现既然不支持输入中文,于是在网上搜罗一下,发现非常多人遇到了相同的问题,可是解决的方法大该就仅仅有一个.以下依据自身的安装及解决的方法 ...
- PostgreSQL在线安装
背景:CentOS 7 一.在线yum安装 yum -y install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7 ...
- maven 私服中央库使用阿里云库
1.admin登录 进入remote repositories management 2. 设置地址
- spring in action小结3 运行时值注入
讨论依赖注入的时候,通常讨论的是一个bean引用注入到另一个bean的属性或者构造器参数中.bean装配的另一个方面是将值注入到bean的属性或者构造器参数中.避免硬编码的方式就是运行时确定值. sp ...
- RPC服务框架dubbo(三):Dubbo支持的协议
1.Dubbo 1.1 Dubbo官方推荐的协议. 1.2 本质:使用NIO和线程池进行处理. 1.3 缺点:大文件传输时可能出现文件传输失败问题. 2.RMI 2.1 JDK提供的协议,远程方法调用 ...