在上一篇文章我们介绍了如何通过 xml 和 JavaConfig 去创建 bean,本篇我们来看看如何配置 bean 的一些基本信息。
1.作用域
类别 | 说明 |
---|---|
singleton | Spring IOC 容器中仅存在一份 bean 实例 |
prototype | 每次都创建新的实例 |
request | 一次 http 请求创建一个新的 bean,仅适用于 WebApplicationContext |
session | 一个 session 对应一个 bean 实例,仅适用于 WebApplicationContext |
globalSession | 一般用于 Portlet 应用环境,作用域仅适用于 WebApplicationContext 环境 |
三点注意:
- 如果不特别指定作用域,那么就默认是singleton
- singleton默认采用的是饿汉模式加载(容器启动实例就创建好了)
- prototype默认采用的是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是 在第一次使用的时候才会创建)
xml:scope
<bean class="com.my.spring.HelloSpring" scope="prototype"></bean>
JavaConfig:@Scope
@Bean
@Scope(value = "prototype")
public Person person() {
return new Person();
}
2.生命周期(单例可控)
创建 -> 初始化 -> 销毁。由容器管理Bean的生命周期,我们可以自己指定bean的初始化方法和bean的销毁方法。
- 针对单实例bean的话,容器启动的时候,bean的对象就创建了,而且容器销毁的时候,也会调用Bean的销毁方法。
- 针对多实例bean的话,容器启动的时候,bean是不会被创建的而是在获取bean的时候被创建,而且bean的销毁不受 IOC容器的管理。
xml:init-method destroy-method
将这两个参数加载要注入的<bean>
<!-- 指定创建和销毁时执行的生命周期方法 -->
<bean class="com.my.spring.HelloSpring" init-method="onInit" destroy-method="onDestroy"></bean>
public class HelloSpring {
public void onInit() {
System.out.println("onInit");
}
public void onDestroy() {
System.out.println("onDestroy");
}
}
JavaConfig:@PostConstruct @PreDestory
将前置与后置方法定义在要加入IOC的Bean内
@Component
public class Book {
public Book() {
System.out.println("book 的构造方法");
}
@PostConstruct
public void init() {
System.out.println("book 的PostConstruct标志的方法");
}
@PreDestroy
public void destory() {
System.out.println("book 的PreDestory标注的方法");
}
}
3.懒加载(单例)
主要针对单实例的bean 容器启动的时候,不创建对象,在第一次使用的时候才会创建该对象
-
懒加载:容器启动的更快,
-
非懒加载:可以容器启动时更快的发现程序当中的错误
选择哪一个就看追求的是启动速度,还是希望更早的发现错误,一般我们会选择后者。
xml:default-lazy-init
xml 要配置在最开始的标签内,里面所有的bean都要懒加载
- true: 懒加载,即延迟加载
- false(默认):非懒加载,容器启动时即创建对象
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true">
JavaConfig:@Lazy
定义在JavaConfig类中,只指定当前bean
@Bean
@Lazy
public Person person() {
return new Person();
}