10.bean的生命周期

一.主要的过程:(简单版)

1、定义阶段(读取到配置文件后就会创建) --> 2、初始化阶段–> 3、调用阶段(getBean()) --> 4、销毁阶段: ApplicationContext销毁时

(1)bean创建
在配置文件里面用<bean></bean>来进行定义,
或者注解进行定义。例:UserDaoImpl.java中
@Repository("userDao") 创建名字为userDao的bean

(2)bean初始化(赋值)
有两种方式初始化:

  • A.在配置文件中通过指定init-method属性来完成

在Bean的类中实现一个初始化Bean属性的方法,如init(),如:

    public class HelloWorld{ 
    public String msg=null; 
    public Date date=null; 
    
    public void init() { 
    msg=”HelloWorld”; 
    date=new Date(); 
    } 
    …… 
    } 

然后,在配置文件中设置init-mothod属性: 

```
  • B.实现org.springframwork.beans.factory.InitializingBean接口

    Bean实现InitializingBean接口,并且增加 afterPropertiesSet() 方法:
    public class HelloWorld implement InitializingBean {
    public String msg=null;
    public Date date=null;

    public void afterPropertiesSet() {
    msg=”向全世界问好!”;
    date=new Date();
    }
    ……
    }

那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对 Bean进行初始化,于是,配置文件就不用指定 init-method属性了。

(3)bean调用
有三种方式可以得到bean实例,并进行调用

  • 1、使用BeanWrapper
 HelloWorld hw=new HelloWorld(); 
 BeanWrapper bw=new BeanWrapperImpl(hw); 
 bw.setPropertyvalue(”msg”,”HelloWorld”); 
 system.out.println(bw.getPropertyCalue(”msg”)); 
  • 2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”); 
XmlBeanFactory factory=new XmlBeanFactory(is); 
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”); 
system.out.println(hw.getMsg()); 
  • 3、使用ApplicationContext (常用)
ApplicationContext ac = new ClassPathXmlApplicationContext("config.xml");
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”); 
System.out.println(hw.getMsg());

(4)bean销毁
销毁有两种方式

  • A.使用配置文件指定的destroy-method属性
    与初始化属性 init-methods类似,在Bean的类中实现一个撤销Bean的方法,然后在配置文件中通过 destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。
  • B.实现org.springframwork.bean.factory.DisposeableBean接口
    如果实现了DisposebleBean接口,那么Spring将自动调用bean中的Destory方法进行销毁,所以,Bean中必须提供 Destory方法。

二.完整版:

  • 1.实例化bean对象(通过构造方法或者工厂方法)
  • 2.设置对象属性(setter等)(依赖注入)
  • 3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
  • 4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
  • 5.将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
  • 6.调用Bean的初始化方法
  • 7.将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
  • 8.使用Bean
  • 9.容器关闭之前,调用Bean的销毁方法

测试:

package com.linjie.cycle;

import org.springframework.beans.factory.BeanNameAware;

/**
 * @author cuichen
 * @Description:一个学生类(Bean),能体现其生命周期的Bean
 */
public class Student implements BeanNameAware {
	private String name;

	//无参构造方法
	public Student() {
		super();
	}

	/** 设置对象属性
	 * @param name the name to set
	 */
	public void setName(String name) {
		System.out.println("设置对象属性setName()..");
		this.name = name;
	}
	
	//Bean的初始化方法
	public void initStudent() {
		System.out.println("Student这个Bean:初始化");
	}
	
	//Bean的销毁方法
	public void destroyStudent() {
		System.out.println("Student这个Bean:销毁");
	}
	
	//Bean的使用
	public void play() {
		System.out.println("Student这个Bean:使用");
	}

	/* 重写toString
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [name = " + name + "]";
	}

	//调用BeanNameAware的setBeanName()
	//传递Bean的ID。
	@Override
	public void setBeanName(String name) {
		System.out.println("调用BeanNameAware的setBeanName()..." ); 
	}
	
}

结果:

在这里插入图片描述

### Spring Bean 生命周期概述 Spring 框架中的 Bean 生命周期由容器全权管理,其过程被划分为多个阶段。以下是关于初始化和销毁两个重要阶段的具体说明。 #### 初始化阶段 初始化阶段是 Bean 生命周期的重要组成部分之一,它发生在实例化和属性注入之后。此阶段的主要目标是对 Bean 进行进一步配置和准备,使其能够正常运行。具体步骤如下: - **激活 Aware 接口方法**:如果某个 Bean 实现了特定的 `Aware` 接口(如 `ApplicationContextAware` 或 `BeanNameAware`),那么在此阶段会调用这些接口的相关方法[^2]。 - **执行 BeanPostProcessor 前置处理**:在实际初始化之前,Spring 容器会调用所有注册的 `BeanPostProcessor` 对象的 `postProcessBeforeInitialization` 方法来对 Bean 进行额外操作[^4]。 - **调用自定义初始化方法**:开发者可以通过 XML 配置文件或者注解方式指定一个初始化回调函数,该函数会在这一时刻被执行。例如,通过实现 `InitializingBean` 接口或声明带有 `@PostConstruct` 注解的方法均可触发此类行为[^3]。 - **执行 BeanPostProcessor 后置处理**:类似于前置处理,这里则会依次调用每个已注册的 `BeanPostProcessor` 的 `postProcessAfterInitialization` 方法以完成最后一步定制化的调整动作。 #### 销毁阶段 当基于作用域 (Scope) 创建出来的单例 Beans 不再需要时,它们会被优雅地清理掉;而对于原型型别的 Beans,则是在每次请求结束后单独释放资源。销毁流程通常涉及以下几个方面: - 如果某对象实现了 `DisposableBean` 接口的话,就会自动调用它的 `destroy()` 函数作为结束标志的一部分逻辑[^1]。 - 可选地设置了一个显式的 destroy-method 属性指向某个用户定义好的清除资源的操作入口点——这同样适用于那些未采用 Java Config 路径的情况下的场景下使用。 ```java // 示例代码展示如何利用 @PreDestroy 注解标记销毁方法 import javax.annotation.PreDestroy; public class MyService { public void start() { /* ... */ } @PreDestroy public void shutdown() { System.out.println("MyService is shutting down..."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值