先说结论

@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. KineticJS教程(12)

    KineticJS教程(12) 作者: ysm  12.舞台 12.1.舞台的大小 舞台创建后还可以用舞台对象的setSize(width, height)方法来设置舞台的宽度与高度. <scr ...

  2. UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出

    TCP输出 下图展示了应用进程写数据到TCP套接口的过程. 每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小. 当应用进程调用write时,内核从应用进 ...

  3. UNIX网络编程读书笔记:端口号、套接口对和套接口

    端口号 端口号(port number):16位整数,用来区分不同的进程. 服务器使用的端口号:TCP和UDP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务. 客户 ...

  4. Linux中more和less命令用法(转)

    一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...

  5. sqlserver学习笔记(五)—— 查询

    查询的基本语法结构: select 列名/* from 表名 [where 限制条件] [order by 排序] 1.查询全部的行和列: select * from 表名 2.查询部分行和列:(部分 ...

  6. Python -- 函数对象

    转自:http://www.cnblogs.com/vamei/archive/2012/07/10/2582772.html 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也 ...

  7. TCP/UDP,SOCKET,HTTP,FTP 简析

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  8. FreeMarker中的list集合前后台代码

    freemarker中的list集合前后台代码: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它 ...

  9. 数据库中varchar类型数据转换为numeric类型

    numeric有好几种选择,有整形.小数型等等.都是用cast来实现 前提:A表的ID字段是VARCHAR类型 .SELECT CAST(ID AS INTEGER) FROM A .SELECT C ...

  10. ruby配置相关

    1.安装ruby 方式1: yum install ruby 方式2:https://www.ruby-lang.org/en/downloads/ 使用源码安装 ./configure make m ...