您的位置:首页 > 编程语言 > Java开发

底层解惑-spring的IOC相关接口:BeanFactory与FactoryBean

2016-05-19 15:16 537 查看
一、区别

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ioc 设计模式