Spring的FactoryBean与PropertyEditor

Spring的FactoryBean有以下功能:
通过自定义的Factory类创建自己需要的对象,而不是使用Spring内置的new(或者class.forName)来创建对象。
这样创建的对象有以下好处:
1.和Spring无缝连接,结构清晰
2.可以根据自己的要求创建一些复杂的对象,便于重用。
例如hibernate的SessionFactory就可以是一个FactoryBean,它需要通过配置获得DataSource等信息
3.不用factoryBean行吗?当然可以。比如:org.apache.commons.dbcp.BasicDataSource就是一个普通的JavaBean
使用和不使用factoryBean的区别就是使用简单工厂和new的区别。
4.再扩展一下,如果是抽象工厂,该如何去做呢?
比如有两种不同的SessionFactory,创建一个抽象类AbstractSessionFactoryBean,有两个实现类,创造不同的产品就可以了
  1. <bean id="sessionFactory"
  2. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"/>

以下是一个例子:
先看配置文件:
  1. <bean id="myBean" class="springStudy.MyFactoryBean"/>
这段xml表示:myBean是由MyFactoryBean产生的。

很简单的MyBean:
  1. package springStudy;
  2. public class MyBean {
  3.     public void doSomething(){
  4.         System.out.println("Hello!");
  5.     }
  6. }
以下是MyFactoryBean:
  1. package springStudy;
  2. import org.springframework.beans.factory.FactoryBean;
  3. import org.springframework.beans.factory.xml.XmlBeanFactory;
  4. import org.springframework.core.io.ClassPathResource;
  5. public class MyFactoryBean implements FactoryBean {
  6.     public static void main(String[] args) {
  7.         XmlBeanFactory factory = new XmlBeanFactory(
  8.                 new ClassPathResource("springStudy.spring.xml"));
  9.         
  10.         MyBean bean1 = (MyBean) factory.getBean("myBean");
  11.         MyBean bean2 = (MyBean) factory.getBean("myBean");
  12.         
  13.         if(bean1 == bean2){
  14.             System.out.println("singleton");
  15.         }else{
  16.             System.out.println("prototype");
  17.         }
  18.     }
  19.     public Object getObject() throws Exception {
  20.         MyBean bean = new MyBean();
  21.         bean.doSomething();
  22.         return bean;
  23.     }
  24.     public Class getObjectType() {
  25.         return MyBean.class;
  26.     }
  27.     public boolean isSingleton() {
  28.         return true;
  29.     }
  30. }
执行代码,显示:
Hello!
singleton
使用FactoryBean.getObject()创建了MyBean,并且在第一次获得MyBean之前执行了bean.doSomething()方法
singleton方式,spring会自动缓存getObject()获得的对象。

如果isSingleton()方法return false;会有以下结果:
Hello!
Hello!
prototype
表明每次都会执行getObject()方法获得对象


接着说PropertyEditor
PropertyEditor的道理非常简单,传入一个字符串,传出你想要的东西,参考网上的一个例子:
Person对象包含了Address对象,Address包括地址和邮编
传入了 上海淮海路1号,200110,返回一个设置好属性的Address

  1. import java.beans.PropertyEditorSupport;  
  2. import java.util.Date;  
  3.  
  4. import org.springframework.util.StringUtils;  
  5. public class AddressPropertyEditor extends PropertyEditorSupport{  
  6.     //支持的格式为 streeValue,doorNumValue,postCode  
  7.     public void setAsText(String text)  {  
  8.        
  9.             String[] strArr = StringUtils.tokenizeToStringArray(text,",");  
  10.             Address add = new Address();  
  11.             add.setStreet(strArr[0]);  
  12.             add.setZipCode(strArr[2]);  
  13.             setValue(add);  
  14.     }  
  15.       
  16. }   


  1.   <bean id="customEditorConfigurer"  class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
  2.   <property name="customEditors"> 
  3.     <map> 
  4.       <entry key="Address"> 
  5.         <bean class="AddressPropertyEditor"/> 
  6.       </entry> 
  7.     </map> 
  8.   </property> 
  9. </bean> 
  10.  
  11. <bean id="person" class="Person"> 
  12.     <property name="name" value="Kent"/> 
  13.     <property name="address" value="上海淮海路1号,200110"/> 
  14. </bean>  
当你getBean获得Person的时候,已经自动产生了一个address的子对象,并且地址和邮编都已经设置好了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值