IOC(十) - Bean的生命週期
阿新 • • 發佈:2020-10-29
Bean的生命週期就是物件從建立到銷燬的過程, 一共有七步:
- 通過構造器建立bean例項(無引數構造);
- 設定bean的屬性值和對其他bean引用(呼叫set方法);
- 把bean例項傳遞給bean後置處理器的方法postProcessBeforeInitialization
- 呼叫bean的初始化的方法(需要配置初始化方法);
- 把bean例項傳遞給bean後置處理器的方法postProcessAfterInitialization
- bean可以使用了(獲取到了物件);
- 當容器關閉的時候, 呼叫bean的銷燬方法(需要配置銷燬方法)
例項演示如下:
建立MyBean類:
public classMyBean { //建立無引數構造器 public MyBean() { System.out.println("1.執行無引數構造器建立bean例項"); } private String name; public void setName(String name) { this.name = name; System.out.println("2.呼叫set方法設定屬性值"); } //建立初始化的執行方法 public void initMethod(){ System.out.println("4.執行初始化的方法"); } //建立銷燬的執行方法 public void destroyMethod(){ System.out.println("7.執行銷燬的方法"); } }
建立MyBeanPost類:(實現BeanPostProcessor介面)
public class MyBeanPost implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throwsBeansException { System.out.println("3.在初始化之前執行的方法"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("5.在初始化之後執行的方法"); return bean; } }
建立配置檔案:(實現了BeanPostProcessor的bean就是後置處理器, 在配置檔案中配好後, Spring會為配置檔案中的所有bean新增此後置處理器)
<?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.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myBean" class="com.ryan.spring5.lifeCycle.MyBean" init-method="initMethod" destroy-method="destroyMethod"> <property name="name" value="張遼"></property> </bean> <!--配置後置處理器--> <bean id="myBeanPost" class="com.ryan.spring5.lifeCycle.MyBeanPost"></bean> </beans>
測試:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("file:src\\com\\ryan\\spring5\\lifeCycle\\bean.xml"); MyBean myBean = context.getBean("myBean", MyBean.class); System.out.println("6.獲取建立例項物件: " + myBean); //手動銷燬bean例項, 需要強轉成ClassPathXmlApplicationContext型別才能呼叫close方法 //*強轉成ClassPathXmlApplicationContext需要載入配置檔案時使用ClassPathXmlApplicationContext方法 ((ClassPathXmlApplicationContext)context).close(); } }
輸出: