javascript
框架:Spring之Aware相关接口
一、Aware相關(guān)接口
對(duì)于應(yīng)用程序來(lái)說(shuō),應(yīng)該盡量減少對(duì)Sping Api的耦合程度,然而有些時(shí)候?yàn)榱诉\(yùn)用Spring所提供的一些功能,有必要讓Bean了解Spring容器對(duì)其進(jìn)行管理的細(xì)節(jié)信息,如讓Bean知道在容器中是以那個(gè)名稱(chēng)被管理的,或者讓Bean知道BeanFactory或者ApplicationContext的存在,也就是產(chǎn)讓該Bean可以取得BeanFactory或者ApplicationContext的實(shí)例,如果Bean可以意識(shí)到這些對(duì)象,那么就可以在Bean的某些動(dòng)作發(fā)生時(shí),做一些如事件發(fā)布等操作。
1.1、Spring提供一些Aware接口:
beanNameAware接口:如果某個(gè)bean需要訪問(wèn)配置文件中本身bean的id屬性,這個(gè)Bean類(lèi)通過(guò)實(shí)現(xiàn)該接口,在依賴(lài)關(guān)系確定之后,初始化方法之前,提供回調(diào)自身的能力,從而獲得本身bean的id屬性,該接口提供了void setBeanName(String name)方法實(shí)現(xiàn),需要指出的是該方法的name參數(shù)就是該bean的id屬性,加調(diào)該setBeanName方法可以讓bean獲取得自身的id屬性
BeanFactoryAware接口:實(shí)現(xiàn)了BeanFactoryAware接口的bean,可以直接通過(guò)beanfactory來(lái)訪問(wèn)spring的容器,當(dāng)該bean被容器創(chuàng)建以后,會(huì)有一個(gè)相應(yīng)的beanfactory的實(shí)例引用,該 接口有一個(gè)方法void setBeanFactory(BeanFactory beanFactory)方法通過(guò)這個(gè)方法的參數(shù)創(chuàng)建它的BeanFactory實(shí)例,實(shí)現(xiàn)了BeanFactoryAware接口,就可以讓Bean擁有訪問(wèn)Spring容器的能力。缺點(diǎn):導(dǎo)致代碼與spring的api耦合在一起,這種方式不推薦。
ApplicationContextAware接口:在Bean類(lèi)被初始化后,將會(huì)被注入applicationContext實(shí)例,該接口有一個(gè)方法,setApplicationContext(ApplicationContext context),使用其參數(shù)context用來(lái)創(chuàng)建它的applicationContext實(shí)例,缺點(diǎn):導(dǎo)致代碼與spring的api耦合在一起,這種方式不推薦。
1.2、beanNameAware接口:
package com.pb.entity;import org.springframework.beans.factory.BeanNameAware; /** 實(shí)體類(lèi)實(shí)現(xiàn)init方法和BeanNameAware接口*/ public class Hello implements BeanNameAware{@Overridepublic void setBeanName(String arg0) {System.out.println("回調(diào)setBeanName方法 id屬性是"+arg0);}public void init(){System.out.println("正在執(zhí)行初始化方法init");}}applicationContext.xml
<bean id="hello" class="com.pb.entity.Hello" init-method="init"></bean>測(cè)試類(lèi):
package com.pb.demo;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.pb.entity.Hello;public class HelloTest {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello=context.getBean("hello",Hello.class);}}結(jié)果:
回調(diào)setBeanName方法 id屬性是hello 正在執(zhí)行初始化方法init1.3、BeanFactoryAware接口:
package com.pb.entity;import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; /** 實(shí)體類(lèi)實(shí)現(xiàn)init方法和BeanNameAware接口*/ public class Hello implements BeanNameAware,BeanFactoryAware{private BeanFactory bf;@Overridepublic void setBeanName(String arg0) {System.out.println("回調(diào)setBeanName方法 id屬性是"+arg0);}public void init(){System.out.println("正在執(zhí)行初始化方法init");}/** 重寫(xiě)setBeanFactory方法* @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)*/@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {this.bf=arg0;}public BeanFactory getBf() {return bf;}}配置文件不變
測(cè)試類(lèi):
package com.pb.demo;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.pb.entity.Hello;public class HelloTest {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello=context.getBean("hello",Hello.class);System.out.println("得到beanFactory對(duì)象 "+hello.getBf());}}結(jié)果:
回調(diào)setBeanName方法 id屬性是hello 正在執(zhí)行初始化方法init 得到beanFactory對(duì)象 org.springframework.beans.factory.support.DefaultListableBeanFactory@3dc0bb: defining beans [hello]; root of factory hierarchy?
1.4、ApplicationContextAware接口:
package com.pb.entity;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.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** 實(shí)體類(lèi)實(shí)現(xiàn)init方法和BeanNameAware接口*/ public class Hello implements BeanNameAware,BeanFactoryAware,ApplicationContextAware{private BeanFactory bf;private ApplicationContext context;@Overridepublic void setBeanName(String arg0) {System.out.println("回調(diào)setBeanName方法 id屬性是"+arg0);}public void init(){System.out.println("正在執(zhí)行初始化方法init");}/** 重寫(xiě)setBeanFactory方法* @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)*/@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {this.bf=arg0;}public BeanFactory getBf() {return bf;}@Overridepublic void setApplicationContext(ApplicationContext arg0)throws BeansException {this.context=arg0;}public ApplicationContext getContext() {return context;}}配置文件不變
測(cè)試類(lèi)
package com.pb.demo;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.pb.entity.Hello;public class HelloTest {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello=context.getBean("hello",Hello.class);System.out.println("得到beanFactory對(duì)象 "+hello.getBf());System.out.println("得到的applicationContext對(duì)象:"+hello.getContext());}}結(jié)果:
回調(diào)setBeanName方法 id屬性是hello 正在執(zhí)行初始化方法init 得到beanFactory對(duì)象 org.springframework.beans.factory.support.DefaultListableBeanFactory@3dc0bb: defining beans [hello]; root of factory hierarchy 得到的applicationContext對(duì)象:org.springframework.context.support.ClassPathXmlApplicationContext@1d04653: startup date [Wed Apr 08 00:43:06 CST 2015]; root of context hierarchy二、BeanPostProcessor類(lèi) 和BeanFactoryPostProcessor
對(duì)容器中的Bean進(jìn)行處理
實(shí)現(xiàn)BeanPostProcessor接口Bean后處理器
public Object postProcessAfterInitialization(Object arg0, String arg1);在bean初始化之后的操作
public Object postProcessBeforeInitialization(Object arg0, String arg1);在bean初始化之前的操作
?第一個(gè)參數(shù)初始化的Bean第二個(gè)參數(shù)是Bean 實(shí)例的名稱(chēng)
容器后處理器在容器實(shí)例化結(jié)束后,對(duì)容器進(jìn)行額外的處理
必須實(shí)現(xiàn)BeanFactoryPostProcessor接口,
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
Spring撮提供了很多后窗口處理器如:
PropertyPlaceholderConfigurer:屬性占位符配置器
PropertyOverrideConfigurer:另外一種屬性占位符配置器
2種的區(qū)別在與后面一種具有覆蓋的性質(zhì)
2.1、PropertyPlaceholderConfigurer
是spring內(nèi)建PropertyEdito,它是beanFactoryPostProcess的實(shí)現(xiàn)類(lèi)
作用:讀取properties配置文件
通過(guò)該實(shí)現(xiàn)類(lèi)可以將spring的配置文件某些屬性值配置到properties文件中,從而只要悠 properties的文件,spring的配置文件即可進(jìn)行相應(yīng)變動(dòng)。
使用1.PropertyPlaceholderConfigure修改某個(gè)部分的屬性時(shí),不需要打開(kāi)Spring配置文件,從而保證不會(huì)將新的錯(cuò)誤引入到spring的配置文件中。
優(yōu)點(diǎn):可以從主xml配置文件中分離出部分的配置信息,
可以支持多個(gè)配置文件,可以將配置文件 分割成多個(gè)配置文件,從而降低修改配置文件的風(fēng)險(xiǎn),
?
2.2、PropertyOverrideConfigurer
會(huì)覆蓋掉XML文件中的配置信息,以.properties屬性文件中的配置為主
如果沒(méi)有配置PropertyOverrideConfigurer則使用XML中的配置信息
屬性格式:
beanName.property=value
其中beanName是springxml配置方便就近中的bean id屬性,value是屬性的值,對(duì)于多個(gè)properties文件,通過(guò)locations屬性來(lái)進(jìn)行指定
三、自定義屬性編輯器
應(yīng)用場(chǎng)景:
類(lèi)型無(wú)法識(shí)別,如日期等
實(shí)現(xiàn)
繼承PropertyEditorSupport
重寫(xiě)setAsText()方法
package com.pb.entity;import java.util.Date;public class AppDate {private Date date;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}}自定義編輯器
package com.pb.entity;import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat;public class CustomerProperty extends PropertyEditorSupport {private String format;@Overridepublic void setAsText(String text) throws IllegalArgumentException {SimpleDateFormat sdf=new SimpleDateFormat(format);//super.setAsText(text);try {//轉(zhuǎn)換對(duì)象,能過(guò)setValue方法重新賦值this.setValue(sdf.parse(text));} catch (ParseException e) {e.printStackTrace();}}public String getFormat() {return format;}public void setFormat(String format) {this.format = format;}}applicationContext.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"><!--定義bean的類(lèi)為自定義編輯器 --><bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"><!-- 屬性 --><property name="customEditors"><!-- map --><map><!-- key為日期 --><entry key="java.util.Date"><!--配置map的value --><bean class="com.pb.entity.CustomerProperty"><!-- 配置屬性 --><property name="format" value="yyyy-MM-dd"></property></bean></entry></map></property></bean><!--配置AppDate的bean --> <bean id="appDate" class="com.pb.entity.AppDate"> <property name="date"> <value>2014-4-8</value> </property> </bean> </beans>測(cè)試類(lèi):
package com.pb.demo;import java.text.SimpleDateFormat;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.pb.entity.AppDate;public class Demo {/*** @param args*/public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");AppDate appDate=context.getBean("appDate",AppDate.class);SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");System.out.println(sdf.format(appDate.getDate()));}}如果不定義自定義編輯器,日期類(lèi)型是沒(méi)有辦法直接注入的
總結(jié)
以上是生活随笔為你收集整理的框架:Spring之Aware相关接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用redis实现异步消息队列
- 下一篇: Collections.sort()自定