手写Spring,理解SpringBean生命周期
发布人:shili8
发布时间:2025-02-17 11:43
阅读次数:0
**手写Spring,理解SpringBean生命周期**
在Spring框架中,Bean是核心概念之一。Bean代表一个Java类实例,可以被Spring IoC容器管理和使用。在本文中,我们将手写Spring框架,并深入探讨Spring Bean的生命周期。
###1. Spring IoC容器首先,让我们来实现一个简单的Spring IoC容器。这个容器负责创建、管理和注入Bean实例。
java// SpringIoC.javapublic class SpringIoC {
private Map beans = new HashMap<>();
public void registerBean(String name, Object bean) {
beans.put(name, bean);
}
public Object getBean(String name) {
return beans.get(name);
}
}
###2. BeanDefinition接下来,我们需要定义一个Bean的元数据,包括其类名、构造函数参数等。我们称之为BeanDefinition。
java// BeanDefinition.javapublic class BeanDefinition {
private String className;
private Class> clazz;
public BeanDefinition(String className) {
this.className = className;
try {
this.clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public Class> getClazz() {
return clazz;
}
}
###3. BeanFactory现在,我们可以实现BeanFactory接口,负责创建和管理Bean实例。
java// BeanFactory.javapublic interface BeanFactory {
Object createBean(String name, BeanDefinition beanDefinition);
}
public class DefaultBeanFactory implements BeanFactory {
private SpringIoC springIoC;
public DefaultBeanFactory(SpringIoC springIoC) {
this.springIoC = springIoC;
}
@Override public Object createBean(String name, BeanDefinition beanDefinition) {
//1. 实例化Bean Object bean = null;
try {
bean = beanDefinition.getClazz().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
//2. 注入依赖 springIoC.registerBean(name, bean);
return bean;
}
}
###4. Bean生命周期在Spring中,Bean的生命周期包括以下几个阶段:
1. **实例化**:创建一个新的Bean实例。
2. **注入依赖**:为Bean提供所需的依赖。
3. **初始化**:执行Bean的初始化方法。
4. **销毁**:释放Bean占用的资源。
我们可以通过实现`BeanLifecycle`接口来定义Bean的生命周期。
java// BeanLifecycle.javapublic interface BeanLifecycle {
void init();
void destroy();
}
public class DefaultBeanLifecycle implements BeanLifecycle {
@Override public void init() {
System.out.println("Initializing bean...");
}
@Override public void destroy() {
System.out.println("Destroying bean...");
}
}
###5. 组合Spring IoC容器和BeanFactory最后,我们可以将Spring IoC容器和BeanFactory组合起来,创建一个完整的Spring框架。
java// Spring.javapublic class Spring {
private SpringIoC springIoC;
private BeanFactory beanFactory;
public Spring(SpringIoC springIoC, BeanFactory beanFactory) {
this.springIoC = springIoC;
this.beanFactory = beanFactory;
}
public Object getBean(String name) {
return springIoC.getBean(name);
}
public void createBean(String name, BeanDefinition beanDefinition) {
Object bean = beanFactory.createBean(name, beanDefinition);
// 执行Bean的生命周期 DefaultBeanLifecycle lifecycle = new DefaultBeanLifecycle();
lifecycle.init();
lifecycle.destroy();
}
}
###6. 使用Spring框架现在,我们可以使用Spring框架来创建和管理Bean实例。
java// Main.javapublic class Main {
public static void main(String[] args) {
SpringIoC springIoC = new SpringIoC();
BeanFactory beanFactory = new DefaultBeanFactory(springIoC);
Spring spring = new Spring(springIoC, beanFactory);
// 创建一个Bean实例 BeanDefinition beanDefinition = new BeanDefinition("com.example.Bean");
spring.createBean("bean", beanDefinition);
// 获取Bean实例 Object bean = spring.getBean("bean");
System.out.println(bean);
}
}
通过以上的步骤,我们手写了一个简单的Spring框架,并理解了Spring Bean的生命周期。

