Spring 如何将无法使用new操作符新建的对象作为spring的bean (使用FactoryBean接口)

当你无法使用new操作符来新建类对象,但又想将他们作为Spring的bean来使用时,FactoryBean是一个完美的解决方案。 

FactoryBean接口声明了3个方法:getObject、getObjectType和isSingleton。 
getObject:方法获取由FactoryBean创建的对象。这是一个真正被传给其他使用FactoryBean作为协作者的bean的对象。 
getObjectType: 告诉Spring你的FactoryBean将返回什么类型的对象。如果事先不知道返回什么类型,将返回null。 
isSingleton:告诉Spring,正在被Spring管理的是否为单例实例。 

例子:
  1. public class MessageDigestFactoryBean implements FactoryBean, InitializingBean {  
  2.     private static final String DEFAULT_ALGORITHM = "MD5";  
  3.       
  4.     private String algorithm = DEFAULT_ALGORITHM;  
  5.     private MessageDigest messageDigest;  
  6.       
  7.     public Object getObject() throws Exception {  
  8.         return this.messageDigest.clone();  
  9.     }  
  10.   
  11.     public Class getObjectType() {  
  12.         return MessageDigest.class;  
  13.     }  
  14.   
  15.     public boolean isSingleton() {  
  16.         return true;  
  17.     }  
  18.   
  19.     public void setAlgorithm(String algorithm) {  
  20.         this.algorithm = algorithm;  
  21.     }  
  22.   
  23.     public void afterPropertiesSet() throws Exception {  
  24.         this.messageDigest = MessageDigest.getInstance(this.algorithm);  
  25.     }  
  26. }  

配置:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="  
  5.                 http://www.springframework.org/schema/beans  
  6.                 http://www.springframework.org/schema/beans/spring-beans.xsd">  
  7.   
  8.     <bean id="sha" class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean">  
  9.         <property name="algorithm" value="SHA1"/>  
  10.     </bean>  
  11.   
  12.     <bean id="md5" class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean"/>  
  13.       
  14. </beans>  

调用:
  1. public class MessageDigestDemo {  
  2.   
  3.     public static void main(String[] args) {  
  4.         XmlBeanFactory factory = new XmlBeanFactory(  
  5.                 new ClassPathResource("/META-INF/spring/factorydemo-context.xml")  
  6.         );  
  7.         MessageDigest d1 = (MessageDigest)factory.getBean("sha");  
  8.         MessageDigest d2 = (MessageDigest)factory.getBean("md5");  
  9.         calculateDigest("Hello, world", d1);  
  10.         calculateDigest("Hello, world", d2);  
  11.     }  
  12.   
  13.     private static void calculateDigest(String message, MessageDigest digest) {  
  14.         System.out.print("Digest using " + digest.getAlgorithm() + ": ");  
  15.         digest.reset();  
  16.         final byte[] bytes = digest.digest(message.getBytes());  
  17.         for (byte b : bytes) {  
  18.             System.out.print(String.format("%02x", b));  
  19.         }  
  20.         System.out.println("");  
  21.     }  
  22.   
  23. }  



直接访问FactoryBean: 
在调用getBean时在bean名字前面添加一个“&”作为前缀就可以获取FactoryBean。 
  1. XmlBeanFactory factory = new XmlBeanFactory(  
  2.         new ClassPathResource("/META-INF/spring/factorydemo-context.xml")  
  3. );  
  4. MessageDigestFactoryBean factoryBean = (MessageDigestFactoryBean)factory.getBean("&sha");  
  5. MessageDigest d1 = (MessageDigest)factory.getBean("sha");  
  6. MessageDigest d2 = (MessageDigest)factoryBean.getObject();  
  7. System.out.println("Equal MessageDigests created? "  
  8.         + (d1.getAlgorithm().equals(d2.getAlgorithm())));  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值