专栏首页技术进阶之路Spring 注解开发之 @Bean 及其相关注解

Spring 注解开发之 @Bean 及其相关注解

这次介绍一下 Spring 中的几个注解 @Bean 以及 @Scope@Lazy

本文的组织结构如下:

  • 先看一下该注解取代了配置文件中的哪些配置;
  • 再总览这些注解有哪些属性值;
  • 最后讲解一下重要的属性值。

Spring 版本 5.1.2.RELEASE

一、XML 配置

在配置文件中,我们使用 bean 标签将组件放入容器中,使用它的 scope 指定作用范围,lazy-init 指定模式是懒加载;

<bean class="top.wsuo.pojo.Person" id="person" scope="singleton" lazy-init="true">
    <property name="name" value="李四"/>
    <property name="age" value="18"/>
</bean>

我们使用 id 属性为组件指定 key 值。

懒加载什么意思? 在解释这个之前先来看一下 scope 的作用。

xml 配置中,scope 属性有两个候选值,分别为:

  • singleton:单实例,默认值;
  • prototype:多实例。

单实例即容器只会初始化对象一次,以后每次获取的对象都是同一个对象;而多实例则相反,每次都不一样。

  • 如果我们指定为单实例的,那么 容器启动时会将对象放到容器中,以后每次获取都是从容器中拿(map.get())
  • 如果指定为多实例的,那么 容器启动时不会去创建对象,而是每次获取的时候才会创建对象

所以当我们指定为单实例的时候无论我们用不用,容器在初始化的时候都会创建对象,即使我们不使用,我们可以通过设置懒加载来延缓创建实例的时间。

lazy-init="true" 改为 true 即代表开启懒加载,默认是关闭的。

以上讲到的配置,均有对应的注解:

配置文件

注解

bean 标签

@Bean 注解

scope 属性

@Scope 注解

lazy-init 属性

@Lazy 注解

二、属性总览

首先放一个例子:

@Lazy
@Scope("prototype")
@Bean("person")
public Person person() {
    System.out.println("给容器添加一个对象");
    return new Person("张三", 20);
}

上面的配置表示:

  • 设置该 Beanid 值为 person
  • 设置作用域为多实例;
  • 设置为懒加载;

三、重要属性讲解

1、@Bean

默认情况:@Bean 注解对应于 Bean 标签,它作用于方法上,其中 class 值即方法的返回值,id 值即方法名。

@AliasFor("value")
String[] name() default {};

可以使用它的 name 属性或者 value 属性值设置自定义的 id 值。

2、@Scope

他有一个属性 value 或者叫作 scopeName 可以指定作用域,有下面几种取值:

// 取值的类型
ConfigurableBeanFactory		# SCOPE_PROTOTYPE
ConfigurableBeanFactory		# SCOPE_SINGLETON
org.springframework.web.context.WebApplicationContext		# SCOPE_REQUEST
org.springframework.web.context.WebApplicationContext		# SCOPE_SESSION
// 具体的值
singleton://单实例;
prototype://多实例;
request://一个请求创建一个实例;
session://一个会话创建一个实例;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring MVC 整合 Servlet 3.0

    根据 Servlet 3.0 的新特性,web 容器启动的时候会扫描每个 jar 包下的 /META-INF/services/javax.servlet.Se...

    wsuo
  • JavaScript 同步和异步的执行机制问题

    今天做项目的时候遇到了一个问题,当我在请求完后端数据的时候,想去立刻打印出请求出来的信息时,怎么打印都是空的,但是出来这个请求方法之后他又有数值了,于是我很纳闷...

    wsuo
  • 微服务 Gateway 的基本配置

    这样当我们访问 http://localhost:8001/payment/get/1 时其实和 http://localhost:9527/payment/g...

    wsuo
  • Docker 微服务教程

    崔庆才
  • Docker 微服务教程

    Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储...

    ruanyf
  • Docker 微服务教程

    Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储...

    wangxl
  • 用于时间序列预测的AutoML

    最近,参加了AutoSeries —时间序列数据的AutoML竞赛,在其中设法获得40个竞争对手(决赛中的15个)的第一名。这篇文章是解决方案的概述。

    代码医生工作室
  • docker中容器如何实现通信

    默认情况下docker的网络模式为Bridge,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到...

    IT大咖说
  • 2020年值得关注的DevOps趋势!

    以下是2020年在DevOps中您可以期待的内容。Netscape的创始人马克•安德森(Marc Andreessen)很久以前就说过,软件正在吞噬整个世界。他...

    用户6543014
  • 小小瓶盖,巨额黑产:揭秘快消行业背后的营销之痛

    随着智慧零售之风愈演愈烈,传统商家纷纷向线上转型升级。快消品作为营销活动最为关注的市场,俨然成为了这场战役的先行军。扫码领红包、集卡送好礼、分享得立减金......

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券