当你无法使用new操作符来新建类对象,但又想将他们作为Spring的bean来使用时,FactoryBean是一个完美的解决方案。
FactoryBean接口声明了3个方法:getObject、getObjectType和isSingleton。
getObject:方法获取由FactoryBean创建的对象。这是一个真正被传给其他使用FactoryBean作为协作者的bean的对象。
getObjectType: 告诉Spring你的FactoryBean将返回什么类型的对象。如果事先不知道返回什么类型,将返回null。
isSingleton:告诉Spring,正在被Spring管理的是否为单例实例。
例子:
配置:
调用:
直接访问FactoryBean:
在调用getBean时在bean名字前面添加一个“&”作为前缀就可以获取FactoryBean。
FactoryBean接口声明了3个方法:getObject、getObjectType和isSingleton。
getObject:方法获取由FactoryBean创建的对象。这是一个真正被传给其他使用FactoryBean作为协作者的bean的对象。
getObjectType: 告诉Spring你的FactoryBean将返回什么类型的对象。如果事先不知道返回什么类型,将返回null。
isSingleton:告诉Spring,正在被Spring管理的是否为单例实例。
例子:
- public class MessageDigestFactoryBean implements FactoryBean, InitializingBean {
- private static final String DEFAULT_ALGORITHM = "MD5";
- private String algorithm = DEFAULT_ALGORITHM;
- private MessageDigest messageDigest;
- public Object getObject() throws Exception {
- return this.messageDigest.clone();
- }
- public Class getObjectType() {
- return MessageDigest.class;
- }
- public boolean isSingleton() {
- return true;
- }
- public void setAlgorithm(String algorithm) {
- this.algorithm = algorithm;
- }
- public void afterPropertiesSet() throws Exception {
- this.messageDigest = MessageDigest.getInstance(this.algorithm);
- }
- }
配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="sha" class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean">
- <property name="algorithm" value="SHA1"/>
- </bean>
- <bean id="md5" class="com.apress.prospring2.ch04.factoy.MessageDigestFactoryBean"/>
- </beans>
调用:
- public class MessageDigestDemo {
- public static void main(String[] args) {
- XmlBeanFactory factory = new XmlBeanFactory(
- new ClassPathResource("/META-INF/spring/factorydemo-context.xml")
- );
- MessageDigest d1 = (MessageDigest)factory.getBean("sha");
- MessageDigest d2 = (MessageDigest)factory.getBean("md5");
- calculateDigest("Hello, world", d1);
- calculateDigest("Hello, world", d2);
- }
- private static void calculateDigest(String message, MessageDigest digest) {
- System.out.print("Digest using " + digest.getAlgorithm() + ": ");
- digest.reset();
- final byte[] bytes = digest.digest(message.getBytes());
- for (byte b : bytes) {
- System.out.print(String.format("%02x", b));
- }
- System.out.println("");
- }
- }
直接访问FactoryBean:
在调用getBean时在bean名字前面添加一个“&”作为前缀就可以获取FactoryBean。
- XmlBeanFactory factory = new XmlBeanFactory(
- new ClassPathResource("/META-INF/spring/factorydemo-context.xml")
- );
- MessageDigestFactoryBean factoryBean = (MessageDigestFactoryBean)factory.getBean("&sha");
- MessageDigest d1 = (MessageDigest)factory.getBean("sha");
- MessageDigest d2 = (MessageDigest)factoryBean.getObject();
- System.out.println("Equal MessageDigests created? "
- + (d1.getAlgorithm().equals(d2.getAlgorithm())));