Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

@Service
public class BeanTest {@Beanpublic   BeanTest  getBean(){BeanTest bean = new  BeanTest();System.out.println("调用方法:"+bean);return bean;}}public class Main {@SuppressWarnings("unused")public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");Object bean1 = context.getBean("getBean");System.out.println(bean1);Object bean2 = context.getBean("getBean");System.out.println(bean2);}
}

输出:

调用方法:Spring.BeanTest@5a4041cc
Spring.BeanTest@5a4041cc
Spring.BeanTest@5a4041cc

默认bean的名称就是其方法名。但是也可以指定名称:

@Service
public class BeanTest {@Bean(name="BeanTest")public   BeanTest  getBean(){BeanTest bean = new  BeanTest();System.out.println("调用方法:"+bean);return bean;}}
public class Main {@SuppressWarnings("unused")public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");Object bean1 = context.getBean("BeanTest");System.out.println(bean1);Object bean2 = context.getBean("BeanTest");System.out.println(bean2);}
}

使用@Bean注解的好处就是能够动态获取一个Bean对象,能够根据环境不同得到不同的Bean对象。或者说将Spring和其他组件分离(其他组件不依赖Spring,但是又想Spring管理生成的bean)。


@Bean 的用法

@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名

定义bean

下面是@Configuration里的一个例子

@Configuration
public class AppConfig {@Beanpublic TransferService transferService() {return new TransferServiceImpl();}}

这个配置就等同于之前在xml里的配置

<beans><bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

bean的依赖

@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖

@Configuration
public class AppConfig {@Beanpublic TransferService transferService(AccountRepository accountRepository) {return new TransferServiceImpl(accountRepository);}}

接受生命周期的回调

任何使用@Bean定义的bean,也可以执行生命周期的回调函数,类似@PostConstruct and @PreDestroy的方法。用法如下

public class Foo {public void init() {// initialization logic}
}public class Bar {public void cleanup() {// destruction logic}
}@Configuration
public class AppConfig {@Bean(initMethod = "init")public Foo foo() {return new Foo();}@Bean(destroyMethod = "cleanup")public Bar bar() {return new Bar();}}

默认使用javaConfig配置的bean,如果存在close或者shutdown方法,则在bean销毁时会自动执行该方法,如果你不想执行该方法,则添加@Bean(destroyMethod="")来防止出发销毁方法

指定bean的scope

使用@Scope注解

你能够使用@Scope注解来指定使用@Bean定义的bean

@Configuration
public class MyConfiguration {@Bean@Scope("prototype")public Encryptor encryptor() {// ...}}

@Scope and scoped-proxy

spring提供了scope的代理,可以设置@Scope的属性proxyMode来指定,默认是ScopedProxyMode.NO, 你可以指定为默认是ScopedProxyMode.INTERFACES或者默认是ScopedProxyMode.TARGET_CLASS。
以下是一个demo,好像用到了(没看懂这块)

// an HTTP Session-scoped bean exposed as a proxy
@Bean
@SessionScope
public UserPreferences userPreferences() {return new UserPreferences();
}@Bean
public Service userService() {UserService service = new SimpleUserService();// a reference to the proxied userPreferences beanservice.setUserPreferences(userPreferences());return service;
}

自定义bean的命名

默认情况下bean的名称和方法名称相同,你也可以使用name属性来指定

@Configuration
public class AppConfig {@Bean(name = "myFoo")public Foo foo() {return new Foo();}}

bean的别名

bean的命名支持别名,使用方法如下

@Configuration
public class AppConfig {@Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })public DataSource dataSource() {// instantiate, configure and return DataSource bean...}}

bean的描述

有时候提供bean的详细信息也是很有用的,bean的描述可以使用 @Description来提供

@Configuration
public class AppConfig {@Bean@Description("Provides a basic example of a bean")public Foo foo() {return new Foo();}}

框架:@Bean注解相关推荐

  1. Spring框架----Spring的bean注解

    这里能看出什么?红线两行表明了它可以通过调用构造函数来进行实例化,因为这都是newInstance,上面可以加参数,下面这个没有任何参数. 对比图一上面一行,他们的作用是不是是一样的,上面图的有一个全 ...

  2. java spring框架 注解_spring框架之注解的使用

    原标题:spring框架之注解的使用 今天是刘小爱自学Java的第122天. 感谢你的观看,谢谢你. 学习内容安排如下: Spring注解的使用. JavaWeb项目的搭建. Spring的Web集成 ...

  3. 05_IOC容器装配Bean(注解方式)

    IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...

  4. Spring - Bean注解配置光速入门

    Bean注解配置光速入门 步骤一: 创建 web 项目,引入 Spring 的开发包 在 Spring 的注解的 AOP 中需要引入 spring-aop 的 jar 包 步骤二: 引入相关配置文件 ...

  5. 被各种注解搞晕了?那快来看看Spring Bean注解详解!

    前言 本篇博客中,我们将会讨论用于声明不同类型 Beans 的几种最常用的 Spring Bean 注解. 众所周知,Spring 容器中有许多配置 Bean 的方法,我们既可以通过 XML 配置,也 ...

  6. Spring学习笔记——@Configuration和@Bean注解

    前言 在Spring框架中,有两种对容器的配置和启动方式,一种是基于XML文档的配置方式,一种则是"零配置",即Java Based Configuration. 而在零配置中,最 ...

  7. Spring框架@PostConstruct注解详解

    文章目录 前言 业务背景 通过依赖查找实现 `@PostConstruct`注解实现 @PostConstruct注解原理 `@PostConstruct`注解 `@PostConstruct`注解源 ...

  8. rethat安装MySQL多例_Spring框架-Bean作用域中单例模式和多例模式的区别

    Spring框架-Bean作用域中单例模式和多例模式的区别 一.单例模式的特点(当没有指定是单例模式还是多例模式的时候,默认是单例模式): 1.Spring容器创建的时候,对应的类的实例化对象一起被创 ...

  9. no qualifying bean of type_就是要让你彻底学会 @Bean 注解

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3 ...

最新文章

  1. python爬虫有什么用处-python为什么叫爬虫 python有什么优势
  2. 梯度提升树(GBDT)原理小结
  3. 边缘计算、区块链、5G,哪个能走的更远
  4. English sentences
  5. Ui5 tool debug - ctrl alt shift s
  6. Java 8 Friday Goodies:Lambda和XML
  7. java链接mysql原始方法_java连接mysql数据库的方法
  8. Linux 远程连接工具 【vnc viewer】 图形界面
  9. 智能锁行业安全分析报告
  10. C# 异步调用控件 跨线程调用控件 跨线程赋值
  11. mfc获取计算机的连接端口,[求助]请问socket编程里,服务器端用什么函数获取客户端的地址与端口...
  12. pe计算机找桌面文件,如何在Windows pe打开桌面文件夹?找不到原桌面文件夹怎么办?...
  13. 汽车标志你认识多少?爱车族一定要了解哦!
  14. xp计算机无法关机,xp系统不能关机解决方法【图文教程】
  15. 极光小课堂 | 极光短信与 Java 整合指南
  16. angular ng lint 相关
  17. 成都盛迈坤电商:提高店铺商品评分的方法
  18. 二叉树的中序遍历 递归与非递归
  19. python怎么用根号_python中根号怎么表示
  20. 光纤之父高锟获英女王封爵

热门文章

  1. python 安装scrapy,openssl opensslv.h错误的解决办法
  2. 深入理解FFM原理与实践
  3. 实习小白::(转) Cocos2d-x 3.0开发(五)关联程序逻辑与cocoStudio导出文件
  4. 【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类
  5. 解决stamp mismatch with graph file
  6. 翻译:创建 Windows8 应用 Part I: Hello, world!
  7. JS 获取控件的绝对位置
  8. Simulink代码生成: 延时模块及其代码
  9. ffmpeg拿AVPacket做缓冲队列时注意
  10. 论文笔记:Group Equivariant Convolutional Networks