先说结论

@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 小知识的更多相关文章

  1. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  2. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  3. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  4. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

  5. salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...

  6. Jquery:小知识;

    Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器   上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...

  7. HTML小知识---Label

    今天知道了一个html小知识: <input type="checkbox" id="chkVersion" />                 ...

  8. Unicode和汉字编码小知识

    Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...

  9. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

随机推荐

  1. 算法笔记_024:字符串的包含(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力轮询法 2.2 素数相乘法 2.3 位运算法 1 问题描述 给定一长字符串A和一短字符串B.请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A ...

  2. 在ubuntu下如何搜索文件?

    来自 1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来.我一般的查找都用这条命令. ...

  3. 查看cache中消耗性能的语句

    sqlserver服务器内存偏高,查看下cache中sql消耗情况! /* 查询cache中的语句 说明:可以根据类型.用户数.大小查询 */ ) declare @usecounts int dec ...

  4. ssh-keygen - 生成、管理和转换认证密钥

    通常使用:[b]ssh-keygen -i -f 公密匙名>> authorized_keys[/b]语法详细介绍[code]ssh-keygen [-q] [-b bits] -t ty ...

  5. OFBiz:组件装入位置

    默认的,OFBiz会在framework.applications.specialpurpose.hot-deploy这几个目录寻找组件,在themes目录中寻找主题.OFBiz是通过framewor ...

  6. 点滴记录——在Ubuntu 14.04中使SublimeText 3支持中文输入法

    在Ubuntu 14.04中安装了SublimeText 3之后发现既然不支持输入中文,于是在网上搜罗一下,发现非常多人遇到了相同的问题,可是解决的方法大该就仅仅有一个.以下依据自身的安装及解决的方法 ...

  7. PostgreSQL在线安装

    背景:CentOS 7 一.在线yum安装 yum -y install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7 ...

  8. maven 私服中央库使用阿里云库

    1.admin登录 进入remote repositories management 2.  设置地址

  9. spring in action小结3 运行时值注入

    讨论依赖注入的时候,通常讨论的是一个bean引用注入到另一个bean的属性或者构造器参数中.bean装配的另一个方面是将值注入到bean的属性或者构造器参数中.避免硬编码的方式就是运行时确定值. sp ...

  10. RPC服务框架dubbo(三):Dubbo支持的协议

    1.Dubbo 1.1 Dubbo官方推荐的协议. 1.2 本质:使用NIO和线程池进行处理. 1.3 缺点:大文件传输时可能出现文件传输失败问题. 2.RMI 2.1 JDK提供的协议,远程方法调用 ...