先说结论

@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. git config 的全局配置

    使用git的全局配置   .gitconfig 一:修改 用户下的.gitconfig 修改如图信息,添加你的信息 二: 命令添加 $ git config --global user.name   ...

  2. ThinkPHP框架返回插入记录的id号

    ThinkPHP返回插入记录的id号 $Form->create()) $result = $Form->add(); 在执行上述语句后,若存在auto_increment字段,则可以使用 ...

  3. Python 遍历set

    遍历set 由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现. 直接使用 for 循环可以遍历 set 的元素: weekdays = set([' ...

  4. Android酷炫加载进度动画

    概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进 ...

  5. 【CI3.1】CI框架简单使用方法

    CI框架简单使用方法 1.回忆MVC 1.1.M:模型,提供数据,保存数据 1.2.V:视图,只负责显示,表单form 1.3.C:控制器,协调模型和视图 1.4.action:动作,是控制器中的方法 ...

  6. 执行 maven 命令 报错Unable to add module to the current project as it is not of packaging type 'pom'[转]

    今天学习在本地搭建Maven工程时,执行了mvn archetype:generate 命令,报错. Unable to create project from archetype [org.apac ...

  7. Android的xml/assets/raw资源使用具体解释

    一.assets/xml/raw资源介绍 1.assets资源文件夹:assets文件夹下存放的资源代表应用无法直接訪问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,訪问方式是 ...

  8. s:if 标签用法总结和举例

    http://www.360doc.com/content/11/1108/18/6161903_162838014.shtml

  9. LIntcode---将二叉搜索树转成较大的树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  10. 并发登录人数控制--Shiro系列(二)

    为了安全起见,同一个账号理应同时只能在一台设备上登录,后面登录的踢出前面登录的.用Shiro可以轻松实现此功能. shiro中sessionManager是专门作会话管理的,而sessinManage ...