Spring的生命周期主要包括以下阶段:
- 创建前准备阶段:在这个阶段,Spring从上下文和相关配置中解析并查找与Bean相关的配置内容,如
init-method
(容器在初始化Bean时调用的方法)和destroy-method
(容器在销毁Bean时调用的方法)。此外,还包括BeanFactoryPostProcessor等Bean加载过程中的前置和后置处理。 - 创建实例阶段:在这个阶段,Spring通过反射创建Bean的实例对象,并扫描和解析Bean声明的属性。
- 依赖注入阶段:在此阶段,Spring检测被实例化的Bean是否存在其他依赖,并对这些依赖进行注入。这通常涉及读取如@Autowired、@Setter等依赖注入的配置。
- 初始化阶段:当Bean的依赖注入完成后,Spring会调用Bean的初始化方法,例如调用Bean的setter方法设置属性值,或者执行@PostConstruct注解的方法。
- 容器缓存阶段:在此阶段,Bean被保存到IoC容器中,以便开发者可以访问和使用它。此时,
init-method
配置的方法会被调用。 - 销毁实例阶段:当Spring容器关闭或Bean不再被使用时,Bean的销毁方法会被调用,释放资源并执行清理操作。如果Bean实现了DisposableBean接口或配置了
destroy-method
属性,它们在这个阶段会被调用。
或者Spring的生命周期主要包括以下几个阶段:
-
实例化(Instantiation):Spring IoC容器根据配置文件或注解信息创建Bean的实例。
-
属性赋值(Dependency Injection):Spring IoC容器为Bean的属性设置值,这通常包括依赖注入(DI),即将其他Bean注入到当前Bean中。
-
初始化(Initialization):在Bean的属性设置完成后,Spring IoC容器会调用Bean的初始化方法,这通常包括实现了
InitializingBean
接口的afterPropertiesSet
方法,或者通过配置文件中指定的init-method
方法。 -
使用(Using):Bean现在可以被应用程序使用了。
-
销毁(Destruction):当Bean不再需要时,Spring IoC容器会调用Bean的销毁方法,这通常包括实现了
DisposableBean
接口的destroy
方法,或者通过配置文件中指定的destroy-method
方法。
下面是一个简单的代码示例,展示了Spring生命周期的各个阶段:
import org.springframework.beans.BeansException; | |
import org.springframework.beans.factory.DisposableBean; | |
import org.springframework.beans.factory.InitializingBean; | |
import org.springframework.context.ApplicationContext; | |
import org.springframework.context.ApplicationContextAware; | |
import org.springframework.context.annotation.Bean; | |
import org.springframework.context.annotation.Configuration; | |
@Configuration | |
public class AppConfig implements ApplicationContextAware { | |
private ApplicationContext applicationContext; | |
@Override | |
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |
this.applicationContext = applicationContext; | |
} | |
@Bean | |
public MyBean myBean() { | |
return new MyBean(); | |
} | |
public static class MyBean implements InitializingBean, DisposableBean { | |
// 实例化阶段 - MyBean的构造函数会被调用 | |
public MyBean() { | |
System.out.println("MyBean - Instantiation"); | |
} | |
// 属性赋值阶段 - 通过setter方法或依赖注入设置属性值 | |
public void setSomeProperty(String property) { | |
System.out.println("MyBean - Property Injection: " + property); | |
} | |
// 初始化阶段 - 实现InitializingBean接口的afterPropertiesSet方法 | |
@Override | |
public void afterPropertiesSet() throws Exception { | |
System.out.println("MyBean - Initialization"); | |
} | |
// 使用阶段 - 可以通过ApplicationContext手动获取Bean并使用它 | |
public void doSomething() { | |
System.out.println("MyBean - Using the bean"); | |
} | |
// 销毁阶段 - 实现DisposableBean接口的destroy方法 | |
@Override | |
public void destroy() throws Exception { | |
System.out.println("MyBean - Destruction"); | |
} | |
} | |
public static void main(String[] args) { | |
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); | |
// 获取并使用Bean | |
MyBean myBean = context.getBean(MyBean.class); | |
myBean.doSomething(); | |
// 关闭ApplicationContext,触发Bean的销毁阶段 | |
((AnnotationConfigApplicationContext) context).close(); | |
} | |
} |
在这个示例中,MyBean
类展示了Spring生命周期的各个阶段。当应用程序启动时,MyBean
的实例会被创建,然后设置属性值,接着调用afterPropertiesSet
方法进行初始化。然后,可以通过ApplicationContext
获取并使用这个Bean。最后,当ApplicationContext
关闭时,destroy
方法会被调用,完成Bean的销毁。
请注意,在实际应用程序中,你可能不会直接在Bean类中实现InitializingBean
和DisposableBean
接口,而是使用@PostConstruct
和@PreDestroy
注解来分别标注初始化方法和销毁方法。此外,init-method
和destroy-method
也可以通过XML配置来指定。