日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Bean的生命周期(二)

發布時間:2024/3/24 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Bean的生命周期(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章大致說明了Spring Bean的生命周期,本章詳細說明各個階段調用的接口方法。

1.1 - 3.2 對應 實例化 Instantiation
4.1 - 4.2 對應 屬性賦值 Populate
5.1 - 10 對應 初始化 Initialization
11- 12 對應 銷毀 Destruction

通過上圖標紅的接口,分類如下:

  • 容器級生命周期接口:InstantiationAwareBeanPostProcessor、BeanPostProcessor,一般稱它們的實現類為“后處理器”,對所有的bean都起作用。
  • Bean級生命周期接口:BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean等接口的方法,這些方法只對當前Bean生效。
  • Bean自身的方法:構造函數、getter/setter和配置文件中<bean>的init-method和destroy-method指定的方法。
  • 工廠后處理器方法:BeanFactoryProcessor一系列接口,包括AspectJWeavingEnabler、CustomAutowireConfigurer、ConfigurationClassPostProcessor等,這些都是Spring框架中已經實現好的。對所有的bean都起作用。
  • 演示

    簡單的Spring Bean來演示一下Spring Bean的生命周期。

    1、工廠后處理器接口方法

    實現 BeanFactoryPostProcessor 接口

    package springBeanTest;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {public MyBeanFactoryPostProcessor() {super();System.out.println("1.1 這是BeanFactoryPostProcessor實現類構造器!!");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)throws BeansException {System.out.println("1.2 BeanFactoryPostProcessor調用postProcessBeanFactory方法");BeanDefinition bd = arg0.getBeanDefinition("person");bd.getPropertyValues().addPropertyValue("phone", "13310134891");} }

    2、InstantiationAwareBeanPostProcessor接口方法

    實現InstantiationAwareBeanPostProcessor接口,一般我們繼承Spring為其提供的適配器類InstantiationAwareBeanPostProcessor Adapter來使用它。

    package springBeanTest;import java.beans.PropertyDescriptor;import org.springframework.beans.BeansException; import org.springframework.beans.PropertyValues; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;public class MyInstantiationAwareBeanPostProcessor extendsInstantiationAwareBeanPostProcessorAdapter {public MyInstantiationAwareBeanPostProcessor() {super();System.out.println("2.1 這是InstantiationAwareBeanPostProcessorAdapter實現類構造器!!");}// 接口方法、實例化Bean之前調用@Overridepublic Object postProcessBeforeInstantiation(Class beanClass,String beanName) throws BeansException {System.out.println("2.3 InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法");return null;}// 接口方法、實例化Bean之后調用@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {System.out.println("3.2 InstantiationAwareBeanPostProcessor調用postProcessAfterInstantiation方法");return true;}// 接口方法、初始化Bean之前調用public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("6.1. InstantiationAwareBeanPostProcessor調用postProcessBeforeInitialization方法");return bean;}// 接口方法、初始化Bean之后調用@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println("9. InstantiationAwareBeanPostProcessor調用postProcessAfterInitialization方法");return bean;}// 接口方法、設置某個屬性時調用@Overridepublic PropertyValues postProcessPropertyValues(PropertyValues pvs,PropertyDescriptor[] pds, Object bean, String beanName)throws BeansException {System.out.println("4.1 InstantiationAwareBeanPostProcessor調用postProcessPropertyValues方法");return pvs;} }

    3、BeanPostProcessor接口方法

    實現BeanPostProcessor接口的方法

    package springBeanTest;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {public MyBeanPostProcessor() {super();System.out.println("2.2 這是BeanPostProcessor實現類構造器!!");// TODO Auto-generated constructor stub}@Overridepublic Object postProcessAfterInitialization(Object arg0, String arg1)throws BeansException {System.out.println("10. BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改!");return arg0;}@Overridepublic Object postProcessBeforeInitialization(Object arg0, String arg1)throws BeansException {System.out.println("6.2. BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改!");return arg0;} }

    4、Bean級生命周期接口和Bean自身方法

    調用Bean自身的方法和Bean級生命周期接口方法,實現BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean這4個接口,配置文件中<bean>的init-method和destroy-method。

    package springBeanTest;import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean;public class Person implements BeanFactoryAware, BeanNameAware,InitializingBean, DisposableBean {public String name;public String address;public String phone;public BeanFactory beanFactory;public String beanName;public Person() {System.out.println("3.1 【構造器】調用Person的構造器實例化");}public String getName() {return name;}public void setName(String name) {System.out.println("4.2 【注入屬性】注入屬性name");this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {System.out.println("4.2 【注入屬性】注入屬性address");this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {System.out.println("4.2 【注入屬性】注入屬性phone");this.phone = phone;}@Overridepublic String toString() {return "Person [address=" + address + ", name=" + name + ", phone="+ phone + "]";}// 這是BeanNameAware接口方法@Overridepublic void setBeanName(String arg0) {System.out.println("5.1 【BeanNameAware接口】調用BeanNameAware.setBeanName()");this.beanName = arg0;}// 這是BeanFactoryAware接口方法@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {System.out.println("5.2 【BeanFactoryAware接口】調用BeanFactoryAware.setBeanFactory()");this.beanFactory = arg0;}// 這是InitializingBean接口方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("7. 【InitializingBean接口】調用InitializingBean.afterPropertiesSet()");Person person = (Person) beanFactory.getBean("person");person.address="上海";}// 這是DiposibleBean接口方法@Overridepublic void destroy() throws Exception {System.out.println("11. 【DiposibleBean接口】調用DiposibleBean.destory()");}// 通過<bean>的init-method屬性指定的初始化方法public void myInit() {/*address="北京";name = "王五";phone = "13686578666";*/System.out.println("8. 【init-method】調用<bean>的init-method屬性指定的初始化方法");}// 通過<bean>的destroy-method屬性指定的初始化方法public void myDestory() {System.out.println("12. 【destroy-method】調用<bean>的destroy-method屬性指定的初始化方法");} }

    5、運行

    配置文件指定springBeanTest/beans.xml

    <?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-3.2.xsd"><bean id="beanFactoryPostProcessor" class="springBeanTest.MyBeanFactoryPostProcessor"></bean><bean id="instantiationAwareBeanPostProcessor" class="springBeanTest.MyInstantiationAwareBeanPostProcessor"></bean><bean id="beanPostProcessor" class="springBeanTest.MyBeanPostProcessor"></bean><bean id="person" class="springBeanTest.Person" init-method="myInit"destroy-method="myDestory" scope="singleton" ><property name="name" value="張三"/><property name="address" value="廣州"/><property name="phone" value="15900000000"/></bean></beans>

    執行類BeanLifeCycle

    package springBeanTest;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanLifeCycle {public static void main(String[] args) {System.out.println("現在開始初始化容器");ApplicationContext factory = new ClassPathXmlApplicationContext("springBeanTest/beans.xml");System.out.println("容器初始化成功");//獲取Preson,并使用Person person = factory.getBean("person",Person.class);System.out.println(person);//獲取person對應bean的id屬性System.out.println("person.beanName=" + person.beanName);//銷毀System.out.println("現在開始關閉容器!");((ClassPathXmlApplicationContext)factory).registerShutdownHook();} }

    輸出:

    現在開始初始化容器 1.1 這是BeanFactoryPostProcessor實現類構造器!! 1.2 BeanFactoryPostProcessor調用postProcessBeanFactory方法 2.1 這是InstantiationAwareBeanPostProcessorAdapter實現類構造器!! 2.2 這是BeanPostProcessor實現類構造器!! 2.3 InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法 3.1 【構造器】調用Person的構造器實例化 3.2 InstantiationAwareBeanPostProcessor調用postProcessAfterInstantiation方法 4.1 InstantiationAwareBeanPostProcessor調用postProcessPropertyValues方法 4.2 【注入屬性】注入屬性name 4.2 【注入屬性】注入屬性address 4.2 【注入屬性】注入屬性phone 5.1BeanNameAware接口】調用BeanNameAware.setBeanName() 5.2BeanFactoryAware接口】調用BeanFactoryAware.setBeanFactory() 6.1. InstantiationAwareBeanPostProcessor調用postProcessBeforeInitialization方法 6.2. BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改! 7.InitializingBean接口】調用InitializingBean.afterPropertiesSet() 8. 【init-method】調用<bean>的init-method屬性指定的初始化方法 9. InstantiationAwareBeanPostProcessor調用postProcessAfterInitialization方法 10. BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改! 容器初始化成功 Person [address=上海, name=張三, phone=13310134891] person.beanName=person 現在開始關閉容器! 11.DiposibleBean接口】調用DiposibleBean.destory() 12. 【destroy-method】調用<bean>的destroy-method屬性指定的初始化方法

    Person類的指定初始化方法myInit賦值

    public class Person implements BeanFactoryAware, BeanNameAware,InitializingBean, DisposableBean {...省略// 通過<bean>的init-method屬性指定的初始化方法public void myInit() {address="北京";name = "王五";phone = "13686578666";System.out.println("8. 【init-method】調用<bean>的init-method屬性指定的初始化方法");} }

    輸出:
    Person [address=北京, name=王五, phone=13686578666]

    綜上所述:

    • 容器級生命周期接口會影響所有Bean創建,一般不需要實現。
    • Bean級生命周期接口可以幫助我們獲取Spring的一些參數,比如BeanName、BeanFactory、ApplicationContext等,當然也可以修改屬性賦值。
    • Bean自身init-method和destroy-method指定的方法可以編寫有關屬性賦值或者其他個性化邏輯。

    參考:
    https://www.cnblogs.com/zrtqsk/p/3735273.html
    免費在線pdf轉換圖片
    http://www.pdfdo.com/pdf-to-image.aspx

    總結

    以上是生活随笔為你收集整理的Spring Bean的生命周期(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。