一、区别
BeanFactory是个 Factory ,也就是 IOC 容器或对象工厂;
FactoryBean 是个 Bean,但是不是普通的bean,该bean是通过getobject()返回一个修饰的bean,而不是它本身,它的实现与设计模式中的工厂模式和修饰器模式类似。
二、代码
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
三、应用
可以在getObject里面实现很多自定义功能。例:如果使用传统方式配置下面Car 的 时, Car 的每个属性分别对应一个 元素标签。如果用FactoryBean 的方式实现就灵活点,下例通过逗号分割符的方式一次性的为 Car 的所有属性指定配置值:
public class ObjectMapperFactoryBean implements FactoryBean<ObjectMapper> {
private ObjectMapper objectMapper = new ObjectMapper();
public ObjectMapperFactoryBean() {
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false)
.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false).getSerializationConfig()
.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Set<String> fliterSet = new HashSet<String>();
FilterProvider filterProvider = new SimpleFilterProvider().addFilter("filter",
SimpleBeanPropertyFilter.serializeAllExcept(fliterSet));
objectMapper.setFilters(filterProvider);
}
public ObjectMapper getObject() throws Exception {
return objectMapper;
}
public Class<? extends ObjectMapper> getObjectType() {
return ObjectMapper.class;
}
public boolean isSingleton() {
return true;
}
}