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()..." ); 
	}
	
}

结果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值