【Spring】IOC(下):实体 Bean 的基本配置

上一篇文章我们介绍了如何通过 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();  
} 

猜你喜欢

转载自blog.csdn.net/weixin_43935927/article/details/114178211