您好,登錄后才能下訂單哦!
前言
在applicationContext.xml中配置完bean之后,Bean的聲明周期狀態有哪些。生命周期的各個階段可以做什么。在applicationContext.xml配置bean的作用域有哪些。其中各個作用域代表的是什么。適用于什么情況。這篇文章做一個記錄。
生命周期
初始化
可以直接查看圖片,圖片來自Spring Bean Life Cycle
從上圖看出,Bean初始化完成包括9個步驟。其中一些步驟包括接口的實現,其中包括BeanNameAware接口,BeanFactoryAware接口。ApplicationContextAware接口。BeanPostProcessor接口,InitializingBean接口。那么這些接口在整個生命周期階段都起到什么作用?后面我們一一介紹。
實例化前
當Bean全部屬性設置完畢后,往往需要執行一些特定的行為,Spring提供了兩種方式來實現此功能:
指定初始化方法
如下:
package com.model; public class InitBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("執行構造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } }
編寫加載器
package com.model; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.UserServiceImpl; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml"); InitBean bean = (InitBean) context.getBean("init"); } }
配置Bean
注意init-method參數
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="init" class="com.model.InitBean" init-method="init"/> </beans>
執行結果
實現InitializingBean接口
實現InitializingBean接口會實現afterPropertiesSet方法,這個方法會自動調用。但是這個方式是侵入性的。一般情況下,不建議使用。
實現afterPropertiesSet方法
package com.model; import org.springframework.beans.factory.InitializingBean; public class InitBean implements InitializingBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("執行構造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } }
配置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" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> --> <bean id="init" class="com.model.InitBean" init-method="init"/> </beans>
結果:
銷毀
同樣,上圖中表示來Bean銷毀時候的過程。包括DisposableBean接口。
使用destroy-method方法
package com.model; import org.springframework.beans.factory.InitializingBean; public class InitBean implements InitializingBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("執行構造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } public void close(){ System.out.println("bean被銷毀"); } }
配置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" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> --> <bean id="init" class="com.model.InitBean" destroy-method="close"/> </beans>
配置加載器
package com.model; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.UserServiceImpl; public class Main { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml"); context.registerShutdownHook(); InitBean bean = (InitBean) context.getBean("init"); } }
結果:
實現DisposableBean接口
實現DisposableBean接口
package com.model; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class InitBean implements InitializingBean,DisposableBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("執行構造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("調用init方法進行成員變量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } public void close(){ System.out.println("bean被銷毀"); } @Override public void destroy() throws Exception { // TODO Auto-generated method stub System.out.println("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" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> --> <!-- <bean id="init" class="com.model.InitBean" destroy-method="close"/> --> <bean id="init" class="com.model.InitBean"/> </beans>
Spring Bean的作用域
作用域 | 描述 |
singleton | 該作用域將 bean 的定義的限制在每一個 Spring IoC 容器中的一個單一實例(默認)。 |
prototype | 該作用域將單一 bean 的定義限制在任意數量的對象實例。 |
request | 該作用域將 bean 的定義限制為 HTTP 請求。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
session | 該作用域將 bean 的定義限制為 HTTP 會話。 只在web-aware Spring ApplicationContext的上下文中有效。 |
global-session | 該作用域將 bean 的定義限制為全局 HTTP 會話。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
配置示例
<bean id="..." class="..." scope="singleton"> </bean>
使用方法注入協調作用域不同的Bean
正常情況下,如果singleton作用域依賴singleton作用域。即每次獲取到的都是一樣的對象。同理,prototype作用域依賴prototype作用域,每次獲取到的都是新的對象。但是,如果singleton依賴prototype作用域,那么每次獲取到的singleton中的prototype都是第一次創建的prototype。如何協調這種關系。保證每次獲取到的都是正確的呢。
對于這種情況,Spring提供了lookup方法用來解決這種問題。
首先我們定義一個原型:
package com.model; public class MyHelper { public void doSomethingHelpful() { } }
然后通過接口注入:
package com.model; public interface DemoBean { MyHelper getHelper(); void somePeration(); }
配置一個單例:
package com.model; /** * 測試類 * @author kevin * */ public abstract class AbstractLookupDemo implements DemoBean { public abstract MyHelper getMyHelper(); @Override public MyHelper getHelper() { // TODO Auto-generated method stub return getMyHelper(); } @Override public void somePeration() { // TODO Auto-generated method stub } }
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helper" class="com.model.MyHelper" scope="prototype"/> <bean id="standardLookupBean" class="com.model.StandardLookupDemo"> <property name="myHelper" ref="helper"></property> </bean> <bean id = "abstractLookupBean" class="com.model.AbstractLookupDemo"> <lookup-method name="getMyHelper" bean="helper"></lookup-method> </bean> </beans>
加載配置文件:
package com.model; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.util.StopWatch; public class Main { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("lookBean.xml"); context.registerShutdownHook(); System.out.println("傳遞standardLookupBean"); test(context, "standardLookupBean"); System.out.println("傳遞AbstractLookupDemo"); test(context, "abstractLookupBean"); } public static void test(AbstractApplicationContext context,String beanName) { DemoBean bean = (DemoBean) context.getBean(beanName); MyHelper helper1 = bean.getHelper(); MyHelper helper2 = bean.getHelper(); System.out.println("測試"+beanName); System.out.println("兩個helper是否相同?"+(helper1==helper2)); StopWatch stopWatch = new StopWatch(); stopWatch.start("lookupDemo"); for (int i = 0; i < 10000; i++) { MyHelper helper = bean.getHelper(); helper.doSomethingHelpful(); } stopWatch.stop(); System.out.println("獲取10000次花費了"+stopWatch.getTotalTimeMillis()+"毫秒"); } }
結果:
從上面的結果圖看出,以前的方式生成的對象每次都是相同的。通過lookup方式注入每次是不同的。可以解決這種問題。但是有沒有更簡單的方式,感覺這種方式優點麻煩。
讓Bean感知Spring容器
實現BeanNameAware,自定設置id值。
實現BeanFactoryAware,ApplicationContextAware 感知Spring容器。獲取Spring容器。
Spring國際化支持
配置配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>message</value> </list> </property> </bean> </beans>
新建中文配置文件
message_zh_CN.properties:
hello=welcome,{0} now=now is : {0}
新建英文配置文件
message_en_US.properties:
hello=\u4F60\u597D,{0} now=\u73B0\u5728\u7684\u65F6\u95F4\u662F : {0}
加載配置文件
package com.model; import java.util.Date; import java.util.Locale; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.util.StopWatch; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("globalization.xml"); String[] a = {"讀者"}; String hello = context.getMessage("hello",a, Locale.CHINA); Object[] b = {new Date()}; String now = context.getMessage("now",b, Locale.CHINA); System.out.println(hello); System.out.println(now); hello = context.getMessage("hello",a, Locale.US); now = context.getMessage("now",b, Locale.US); System.out.println(hello); System.out.println(now); } }
結果
總結
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。