这次介绍一下 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);
}
上面的配置表示:
- 设置该
Bean
的id
值为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://一个会话创建一个实例;