标题:Spring中Bean的生命周期详解
在Spring中,Bean的生命周期可以分为以下8个步骤:
1.实例化Bean对象
2.填充Bean属性
3.调用Bean的Aware方法
4.调用Bean的初始化方法
5.使用Bean
6.调用Bean的销毁方法
7.清除Bean的属性值
8.封存Bean
以下是对以上8个步骤的详细讲解:
1.实例化Bean对象
当Spring需要一个Bean时,会先查看Bean定义中是否有lazy-init="true"属性,如果该属性的值为true,则不会立即实例化Bean对象,而是等到第一次使用该Bean对象时再进行实例化。如果lazy-init="false"或者没有设置该属性,则会在容器启动时立即实例化Bean对象。可以通过以下配置方式来控制Bean的实例化时机:
<bean id="exampleBean" class="com.example.ExampleBean" lazy-init="true"/>
2.填充Bean属性
当Bean对象被实例化后,Spring会自动为该Bean对象注入所有在Bean定义中配置的属性,通常情况下这些属性会使用基于XML的依赖注入或基于注解的依赖注入方式来配置。示例代码如下:
XML配置方式:
<bean id="exampleBean" class="com.example.ExampleBean">
<property name="name" value="John"/>
<property name="age" value="30"/>
</bean>
注解方式:
@Component
public class ExampleBean {
@Value("John")
private String name;
@Value("30")
private int age;
// getter and setter methods
}
3.调用Bean的Aware方法
在填充Bean属性的过程中,Spring会自动调用所有实现了Aware接口的Bean的setXXX()方法(例如实现了BeanNameAware接口的Bean会自动调用setBeanName()方法)。这些Aware接口包括以下几种:
- BeanNameAware:获取Bean的ID
- BeanFactoryAware:获取BeanFactory对象
- ApplicationContextAware:获取ApplicationContext对象
- ServletContextAware:获取ServletContext对象
示例代码如下:
public class ExampleBean implements BeanNameAware,
BeanFactoryAware, ApplicationContextAware {
// ...
@Override
public void setBeanName(String beanName) {
this.beanName = beanName;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
// ...
}
4.调用Bean的初始化方法
在Bean属性的注入过程完成后,Spring会自动调用该Bean的初始化方法,该方法可以使用两种方式来定义:
- 通过实现InitializingBean接口,在afterPropertiesSet()方法中定义初始化逻辑
- 通过配置init-method属性,在XML配置文件中定义初始化方法
示例代码如下:
通过实现InitializingBean接口的初始化方法:
public class ExampleBean implements InitializingBean {
// ...
@Override
public void afterPropertiesSet() throws Exception {
// initialization logic here
}
// ...
}
通过配置init-method属性的初始化方法:
<bean id="exampleBean" class="com.example.ExampleBean"
init-method="init">
</bean>
5.使用Bean
当Bean实例化和初始化完成后,就可以通过依赖注入或手动获取Bean对象来使用它。
6.调用Bean的销毁方法
当Spring容器关闭时,会自动调用所有实现了DisposableBean接口的Bean的destroy()方法,也可以通过配置destroy-method属性在XML配置文件中定义销毁方法。
示例代码如下:
通过实现DisposableBean接口的销毁方法:
public class ExampleBean implements DisposableBean {
// ...
@Override
public void destroy() throws Exception {
// destruction logic here
}
// ...
}
通过配置destroy-method属性的销毁方法:
<bean id="exampleBean" class="com.example.ExampleBean"
destroy-method="destroy">
</bean>
7.清除Bean的属性值
当Bean的作用域为prototype时,Spring会在Bean使用完毕后自动清除Bean的属性值。如果Bean的作用域为singleton,则不会清除Bean的属性值,因为该Bean会一直存留在Spring容器中。
8.封存Bean
Spring提供了一个ScopedProxyFactoryBean,可以将Bean的作用域改为proxy。这样当Bean被封存时,Spring会先销毁Bean,然后通过代理的方式来获取Bean的实例。
示例代码如下:
<bean id="exampleBean" class="com.example.ExampleBean"
scope="prototype">
<aop:scoped-proxy/>
</bean>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 中 Bean 的生命周期详解 - Python技术站