一、什么是Bean?
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
Bean是一個由Spring IoC容器實例化、組裝和管理的對象,bean就是一個實例。
二、Bean 的完整生命周期
Bean從創建-參與計算流程-銷毀,spring通過IOC控制翻轉進行操作,所以bean的整個生命周期都會暴露操作實例的方法,通過這些方法,可以更加靈活的操控每個實例對象。
下面展示了一個Bean的構造過程
Bean 的生命周期
-
Spring啟動,查找並加載需要被Spring管理的bean,進行Bean的實例化,配置文件中<bean>表示一個bean,也可以使用各種注解;
-
然后對Bean在文件或注解中設置的屬性等進行注入;
-
如果Bean實現了BeanNameAware接口,Spring將Bean的Id傳遞給setBeanName()方法,此處可以重新修改beanName;
-
如果Bean實現了BeanFactoryAware接口,Spring將調用setBeanFactory()方法,將BeanFactory容器實例傳入;
-
如果Bean實現了ApplicationContextAware接口,Spring將調用Bean的setApplicationContext()方法,將bean所在應用上下文引用傳入進來。
-
如果Bean實現了BeanPostProcessor接口,Spring就將調用他們的postProcessBeforeInitialization()方法。
-
如果Bean 實現了InitializingBean接口,Spring將調用他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明了初始化方法,該方法也會被調用
-
如果Bean 實現了BeanPostProcessor接口,Spring就將調用他們的postProcessAfterInitialization()方法。
-
此時,Bean已經准備就緒,可以被應用程序使用了。他們將一直駐留在應用上下文中,直到應用上下文被銷毀。
-
如果bean實現了DisposableBean接口,Spring將調用它的destory()接口方法,同樣,如果bean使用了destory-method 聲明銷毀方法,該方法也會被調用。
記憶方法:數豬名 工廠上下 初始化四階段 系統自我銷毀
三、生命周期中函數在開發中有什么用
我以前看到bean的生命周期的時候只是簡單的記住它的順序,感覺沒什么用,真的是to yong to simple;
1.屬性注入
<bean id="car1" class="com.demo.Car"> <property name="name" value="寶馬"></property> <property name="price" value="100000"></property> </bean>
這樣在car的類中有一個
public Car(String name,double price){ this.name=name; this.price=price; }
就可以實現一個設置好初始值得一個bean
2.BeanNameAware接口,有一個setBeanName方法
可以在類中新建一個String beanName變量,通過setBeanName進行復制,這樣就可以知道這個bean的Name,
上面的id="car1" 也會通過這個setBeanName傳入到實例中;
3.BeanFactoryAware接口,可以獲得創建這個實例的工廠方法
BeanFactory 可以獲得或者設置類
String FACTORY_BEAN_PREFIX = "&"; Object getBean(String var1) throws BeansException; <T> T getBean(String var1, Class<T> var2) throws BeansException; <T> T getBean(Class<T> var1) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; boolean containsBean(String var1); boolean isSingleton(String var1) throws NoSuchBeanDefinitionException; boolean isPrototype(String var1) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException; Class<?> getType(String var1) throws NoSuchBeanDefinitionException; String[] getAliases(String var1);
4.ApplicationContextAware 可以獲得ApplicationContext 上下文,
applicationContext.getBeansOfType(RegistryConfig.class)
applicationContext可以通過getBeansOfType獲得所有已經繼承RegistryConfig這個配置文件的實例Map,
Map的key是beanName value是對應的實例,這樣這個類需要什么配置就能很好的確定
5.BeanPostProcessor接口的postProcessBeforeInitialization 、postProcessAfterInitialization
是在系統初始化和自定義初始化之前和之后的一些處理方法,針對所有Spring上下文中所有的bean,
可以在配置文檔applicationContext.xml中配置一個BeanPostProcessor,
然后對所有的bean進行一個初始化之前和之后的代理
6.InitializingBean接口,afterPropertiesSet是系統的初始化方法,此處可以對父類做一些基本的初始化
7.調用自己定義的初始化方法
<bean id="beanA" class="classA" init-method="anotherInit">
</bean>
init-method 配置的初始化方法
8.DisposableBean 系統銷毀時調用的方法
9.自定義銷毀方法:
<bean class="com.demo" init-method="start" destroy-method="destroy">
</bean>
destroy-method方法