Spring容器可以幫助你管理所有的Bean對象,專業(yè)術(shù)語稱之為IoC控制反轉(zhuǎn)。在傳統(tǒng)的程序中,對象的生成都是由開發(fā)者完成的。而在控制反轉(zhuǎn)中,對象的生成全部都交給框架完成。這樣的好處就是減少了程序的依賴性。
Bean在Spring中的生命周期如下:
實例化。Spring通過new關(guān)鍵字將一個Bean進(jìn)行實例化,javaBean都有默認(rèn)的構(gòu)造函數(shù),因此不需要提供構(gòu)造參數(shù)。填入屬性。Spring根據(jù)xml文件中的配置通過調(diào)用Bean中的setXXX方法填入對應(yīng)的屬性。事件通知。Spring依次檢查Bean是否實現(xiàn)了BeanNameAware、BeanFactoryAware、applicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的話,依次調(diào)用這些接口。使用。應(yīng)用程序可以正常使用這個Bean了。銷毀。如果Bean實現(xiàn)了DisposableBean接口,就調(diào)用其destroy方法。定義一個Bean的語法如下。
<beans xmlns="..."> <bean id="apple" class="com.whitejava.Apple"/></beans>使用這個Bean時只要通過applicationContext.getBean("apple")即可獲取。
作用域。在Spring中還可以指定Bean的作用域,也就是Bean的壽命,只要設(shè)置bean標(biāo)簽的scope屬性即可。Spring提供的生命周期有:singleton整個應(yīng)用只有一個、prototype每次調(diào)用都產(chǎn)生一個新的、request每個HTTP請求對應(yīng)一個bean、session每個HTTP會話對應(yīng)一個bean、global-session每個portlet上下文session對應(yīng)一個bean。默認(rèn)生命周期是singleton。
初始化和銷毀。第一種方法,在xml中的bean標(biāo)簽增加init-method和destroy-method屬性來指定初始化和銷毀方法。第二種方法,在bean的java類中implements InitializingBean或者DisposableBean接口實現(xiàn)初始化和銷毀。第三種方法,在xml中的beans標(biāo)簽中增加default-init-method和default-destroy-method屬性。
另外,可以通過RPC或者JMS配置遠(yuǎn)程Bean。后面的章節(jié)有介紹。
外部配置
有時候有些關(guān)鍵的屬性,比如數(shù)據(jù)庫密碼,需要放在xml文件之外,便于后續(xù)修改。Spring解決這個問題的方法有兩種,一種是屬性占位符,一種是屬性重寫。另外阿里提供的AutoConfig有更好的配置管理機(jī)制,將在后面詳細(xì)介紹。
關(guān)于占位符,首先載入屬性文件:
<context:property-placeholder location="classpath:/db.properties"/>或者<context:property-placeholder location="file:///etc/db.properties"/>引用屬性中的變量:
<bean id="dataSource" class="org.springframework.jdbc.datbase.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}/></bean>覆蓋properties文件中的變量:
<util:properties id="defConf> <prop key="jdbc.url">jdbc:MySQL://localhost/test</prop> <prop key="jdbc.driverClassName">com.mysql.jdbc.Driver</prop></util:properties><context:property-placeholder location="classpath:/db.properties" properties-ref="defConf" system-properties-mode="OVERRIDE"/>除了OVERRIDE還有FALLBACK、NEVER。覆蓋xml配置。載入properties文件并覆蓋現(xiàn)有的xml配置。請看下面的例子:
<bean id="dataSource" class="xxx"> <property name="url">jdbc:Oracle://xxx</property> <property name="username">xxx</property></bean><context:property-overrider location="classpath:/db.properties"/>db.properties文件的內(nèi)容:
dataSource.url=jdbc:mysql://xxxdataSource.username=yyy加密配置值。載入經(jīng)過加密的properties文件:
<bean id="environmentConfig" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithmd5AndDES"/> <property name="passWordEnvName" value="DB_ENCRYPTION_PWD"/></bean><bean id="stringEncrypter" class="org.jasypt.encryption.pbe.Environment"> <property name="config-ref" ref="environmentConfig"/></bean><bean id="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="stringEncrypter"/></bean>Session
Spring中的Session一般不需要直接操作,而是將數(shù)據(jù)保存到Bean容器中的scope=session中。
新聞熱點
疑難解答