Spring框架的bean生命周期是由容器管理的,主要包括以下几个阶段:实例化、属性赋值、初始化和销毁。
1、实例化阶段:在这个阶段,Spring容器会根据配置文件中的信息,通过反射机制创建bean的实例。具体实现代码如下:
BeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition(beanName, definition);
BeanDefinition definition = new GenericBeanDefinition();
definition.setBeanClassName(className);
Object beanInstance = beanFactory.getBean(beanName);
2、属性赋值阶段:在这个阶段,Spring容器会根据配置文件中的信息,将属性值注入到bean实例中。具体实现代码如下:
BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
PropertyValues propertyValues = definition.getPropertyValues();
for (PropertyValue propertyValue : propertyValues.getPropertyValues()) {
String propertyName = propertyValue.getName();
Object propertyValue = propertyValue.getValue();
// 使用反射给bean实例设置属性值
BeanUtils.setProperty(beanInstance, propertyName, propertyValue);
}
3、初始化阶段:在这个阶段,Spring容器会调用bean实例的初始化方法。具体实现代码如下:
// 判断是否实现了InitializingBean接口
if (beanInstance instanceof InitializingBean) {
((InitializingBean) beanInstance).afterPropertiesSet();
}
// 判断是否配置了init-method属性
String initMethodName = definition.getInitMethodName();
if (StringUtils.hasLength(initMethodName)) {
Method initMethod = ClassUtils.getMethod(beanClass, initMethodName);
ReflectionUtils.invokeMethod(initMethod, beanInstance);
}
4、销毁阶段:在这个阶段,Spring容器会调用bean实例的销毁方法。具体实现代码如下:
// 判断是否实现了DisposableBean接口
if (beanInstance instanceof DisposableBean) {
((DisposableBean) beanInstance).destroy();
}
// 判断是否配置了destroy-method属性
String destroyMethodName = definition.getDestroyMethodName();
if (StringUtils.hasLength(destroyMethodName)) {
Method destroyMethod = ClassUtils.getMethod(beanClass, destroyMethodName);
ReflectionUtils.invokeMethod(destroyMethod, beanInstance);
}
在整个过程中,Spring容器通过反射机制创建、初始化和销毁bean实例,同时根据配置文件将属性值注入到bean实例中。
Spring框架使用了以下几种工厂模式:
1、工厂方法模式(Factory Method Pattern):Spring中最常用的工厂模式就是工厂方法模式,它将对象的创建委托给子类来实现,从而将对象的实例化与使用代码解耦。在Spring中,BeanFactory就是一个典型的工厂方法模式的实现,它是通过xml配置文件或注解来定义bean的创建和管理,并且可以根据需要创建不同的BeanFactory实现类。例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean("myBean", MyBean.class);
2、抽象工厂模式(Abstract Factory Pattern):抽象工厂模式是一种创建型设计模式,它提供了一个接口来创建一系列相关或相互依赖的对象,而无需指定具体的类。在Spring中,BeanFactory接口就是抽象工厂模式的实现,它定义了创建和管理bean的方法,并且可以通过不同的实现类提供不同的创建逻辑。例如:
ConfigurableListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("myBean", new MyBean());
MyBean myBean = beanFactory.getBean("myBean", MyBean.class);
3、单例模式(Singleton Pattern):单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在Spring中,单例模式被广泛应用于bean的创建和管理,通过配置文件或注解可以将一个类定义为单例,Spring容器会负责管理该单例的生命周期。例如:
@Component
@Scope("singleton")
public class MySingletonBean {
// ...
}