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

本文介绍如何在Spring框架中利用FactoryBean接口管理类对象,通过配置示例展示如何实现对象创建、类型指定及单例管理,并提供直接访问FactoryBean的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

例子:
  1. publicclassMessageDigestFactoryBeanimplementsFactoryBean, InitializingBean {
  2. privatestaticfinalString DEFAULT_ALGORITHM ="MD5";
  3. privateString algorithm = DEFAULT_ALGORITHM;
  4. privateMessageDigest messageDigest;
  5. publicObject getObject()throwsException {
  6. returnthis.messageDigest.clone();
  7. }
  8. publicClass getObjectType() {
  9. returnMessageDigest.class;
  10. }
  11. publicbooleanisSingleton() {
  12. returntrue;
  13. }
  14. publicvoidsetAlgorithm(String algorithm) {
  15. this.algorithm = algorithm;
  16. }
  17. publicvoidafterPropertiesSet()throwsException {
  18. this.messageDigest = MessageDigest.getInstance(this.algorithm);
  19. }
  20. }

配置:
  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. <bean id="sha"class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean">
  8. <property name="algorithm"value="SHA1"/>
  9. </bean>
  10. <bean id="md5"class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean"/>
  11. </beans>

调用:
  1. publicclassMessageDigestDemo {
  2. publicstaticvoidmain(String[] args) {
  3. XmlBeanFactory factory =newXmlBeanFactory(
  4. newClassPathResource("/META-INF/spring/factorydemo-context.xml")
  5. );
  6. MessageDigest d1 = (MessageDigest)factory.getBean("sha");
  7. MessageDigest d2 = (MessageDigest)factory.getBean("md5");
  8. calculateDigest("Hello, world", d1);
  9. calculateDigest("Hello, world", d2);
  10. }
  11. privatestaticvoidcalculateDigest(String message, MessageDigest digest) {
  12. System.out.print("Digest using "+ digest.getAlgorithm() +": ");
  13. digest.reset();
  14. finalbyte[] bytes = digest.digest(message.getBytes());
  15. for(byteb : bytes) {
  16. System.out.print(String.format("%02x", b));
  17. }
  18. System.out.println("");
  19. }
  20. }



直接访问FactoryBean:
在调用getBean时在bean名字前面添加一个“&”作为前缀就可以获取FactoryBean。
  1. XmlBeanFactory factory =newXmlBeanFactory(
  2. newClassPathResource("/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、付费专栏及课程。

余额充值