Spring核心学习(2)管理Bean的生命周期

前导:开始学习Spring核心思想,通过一个山寨精简版Spriing代码结合学习。

内容:1. 抽象BeanFactory-面向接口更易拓展BeanFactory-面向接口更易拓展。 2. 在AbstractBeanFactory内部初始化Bean。

这里的BeanDefinition相比上一个更加丰富,多了BeanDefinition包含的Bean的Class的信息,这里我们不在注册前就把Bean实例化给BeanDefinition,而是延迟到注册的时候才实例化Bean给BeanDefinition。

BeanDefinition:

package step2.core;

public class BeanDefinition {
	private Object bean;

	private Class beanClass;

	private String beanClassName;

	public BeanDefinition() {}

	public Object getBean() {
		return bean;
	}

	public void setBean(Object bean) {
		this.bean = bean;
	}

	public Class getBeanClass() {
		return beanClass;
	}

	public void setBeanClass(Class beanClass) {
		this.beanClass = beanClass;
	}

	public String getBeanClassName() {
		return beanClassName;
	}

	public void setBeanClassName(String beanClassName) {
		this.beanClassName = beanClassName;
		try {
			this.beanClass = Class.forName(beanClassName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

}

BeanFactory:

public interface BeanFactory {

	Object getBean(String name);

	void registerBeanDefinition(String name, BeanDefinition beanDefinition);
}

AbstractBeanFactory:

public abstract class AbstractBeanFactory implements BeanFactory{
	private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();

	@Override
	public Object getBean(String name) {
		return beanDefinitionMap.get(name).getBean();
	}

	@Override
	public void registerBeanDefinition(String name,
			BeanDefinition beanDefinition) {
		Object bean = doCreateBean(beanDefinition);
		beanDefinition.setBean(bean);
		beanDefinitionMap.put(name, beanDefinition);
	}

	/**
     * 初始化bean
     * @param beanDefinition
     * @return
     */
    protected abstract Object doCreateBean(BeanDefinition beanDefinition);
}

AutowireCapableBeanFactory:

public class AutowireCapableBeanFactory extends AbstractBeanFactory{

	@Override
	protected Object doCreateBean(BeanDefinition beanDefinition) {
		try {
			Object bean = beanDefinition.getBeanClass().newInstance();
			return bean;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		return null;
	}

}
public class HelloWorldService {

    public void helloWorld(){
        System.out.println("Hello World! from step2");
    }
}
public class BeanFactoryTest {

	@Test
	public void test() {
		// 1.初始化bean
		BeanFactory beanFactory = new AutowireCapableBeanFactory();

		// 2.注入bean
		BeanDefinition beanDefinition = new BeanDefinition();
		beanDefinition.setBeanClassName("step2.test.HelloWorldService");
		beanFactory.registerBeanDefinition("helloWorldService", beanDefinition);

		// 3.获取bean
		HelloWorldService helloWorldService = (HelloWorldService)beanFactory.getBean("helloWorldService");
		helloWorldService.helloWorld();
	}
}
时间: 2024-11-03 22:15:30

Spring核心学习(2)管理Bean的生命周期的相关文章

Spring4.0学习笔记(5) —— 管理bean的生命周期

Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法创建Bean的实例 2.为Bean的属性设置值和对其他Bean的引用 3.调用Bean的初始化方法 4.Bean可以使用了 5.当容器关闭时,调用Bean的销毁方法 bean文件 package com.spring.cycle; public class Car { public Car(){ S

Spring笔记——6.容器中bean的生命周期

spring可以管理单例bean的生命周期,知道何时被创建,核实初始化,何时销毁,也可以进行某些通用资源申请,销毁前资源回收.对于prototype,容器只负责创建,之后就撒手不管自生自灭.容器不知道一共创建了多少prototype,也不知道他们什么时候会被销毁,所以容器没法管理prototype. 管理bean的生命周期有如下两个时机: 注入依赖关系后 即将销毁bean前 依赖关系注入后的行为 通过设定init-method属性指定某个方法或者实现InitializingBean接口指定需要实

MyEclipse Spring 学习总结二 Bean的生命周期

文件结构可以参考上一节 Bean的生命周期有方法有:init-method,destroy-method ApplicationContext.xml 文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/

Spring 框架基础(02):Bean的生命周期,作用域,装配总结

本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象. 1.XML格式装配 Spring最传统的Bean的管理方式. 配置方式 <bean id="userInfo" class="com.spring.mvc.entity.UserInfo"> <property name="na

Spring——管理Bean的生命周期

我们可以自定义bean的初始化和销毁方法,这里所指的的初始化和bean的构造不同,初始化是在bean构造完成后,对bean内部的属性或一些逻辑进行初始化. 首先要弄清一些概念: 构造(对象创建) 单实例:在容器启动时创建对象 多实例:在每次获取的时候创建对象 初始化:在对象创建后调用 销毁: 单实例:在容器关闭时执行销毁方法 多实例:容器不会管理,不会调用销毁方法 下面提供几种方法供参考 一.指定初始化和销毁方法 在配置类中,我们可以通过@Bean指定initMethod 和destroyMet

Spring学习笔记3 - Bean的生命周期

当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态. 当bean不再需要,并且从容器中移除是,可能需要做一些清除工作. 为了定义安装和拆卸一个bean,我们只要声明带有init-method和/或destroy-method参数 init-method属性指定一个方法,在实例化bean时,立即调用该方法. destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法. 示例: beans.xml <?xml version="1.0"

Spring_管理 Bean 的生命周期

beans-cycle.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spr

Spring的Bean的生命周期以及Bean的后置处理器

Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1通过构造器或工厂方法创建 Bean 实例 2为 Bean 的属性设置值和对其他 Bean 的引用 3调用 Bean 的初始化方法(可以人为指定,利用Bean标签的inti-method属性指定初始化方法,不指定就默认忽略这步骤) Bean 可以使用了 4当容器关闭时, 调用 Bea

IOC容器中bean的生命周期

一.Bean生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 Bean可以使用了 当容器关闭时,调用Bean的销毁方法 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法. 下面通过示例