Spring学习笔记——Spring中的BeanFactory与FactoryBean
2015-07-07 16:04
537 查看
BeanFactory
BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范,他的实现类有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都各自实现自己的功能。
FactoryBean
通常Spring通过反射机制利用bean的class属性来指定实现类的实例化Bean,在某些情况下实例化Bean的过程比较复杂,如果按照传统方式则需要在bean中提供大量的配置信息,而利用Spring提供了一个org.springframework.bean.factory.FactoryBean的工厂接口类,用户可以通过实现该接口定制实例化Bean的逻辑。下面是FactoryBean的源代码,注释很强大,可惜我的英语一般,简单翻译一下。
当配置文件中的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法返回的对象,相当于FactoryBean#getObject()代理了getBean
两者区别:
BeanFactory是一个factory,也就是IOC容器或对象工厂,FactoryBean是个Bean,在Spring中,所有的Bean都是由BeanFactory(IOC)来进行管理的。但对FactoryBean而言,这个Bean是一个生产或者修饰对象生成的工厂Bean,他的实现与设计模式中的工厂模式和修饰器模式类似。
BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范,他的实现类有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都各自实现自己的功能。
FactoryBean
通常Spring通过反射机制利用bean的class属性来指定实现类的实例化Bean,在某些情况下实例化Bean的过程比较复杂,如果按照传统方式则需要在bean中提供大量的配置信息,而利用Spring提供了一个org.springframework.bean.factory.FactoryBean的工厂接口类,用户可以通过实现该接口定制实例化Bean的逻辑。下面是FactoryBean的源代码,注释很强大,可惜我的英语一般,简单翻译一下。
/** * Interface to be implemented by objects used within a {@link BeanFactory} * which are themselves factories. If a bean implements this interface, * it is used as a factory for an object to expose, not directly as a bean * instance that will be exposed itself. * * <p><b>NB: A bean that implements this interface cannot be used as a * normal bean.</b> A FactoryBean is defined in a bean style, but the * object exposed for bean references ({@link #getObject()} is always * the object that it creates. * * <p>FactoryBeans can support singletons and prototypes, and can * either create objects lazily on demand or eagerly on startup. * The {@link SmartFactoryBean} interface allows for exposing * more fine-grained behavioral metadata. * * <p>This interface is heavily used within the framework itself, for * example for the AOP {@link org.springframework.aop.framework.ProxyFactoryBean} * or the {@link org.springframework.jndi.JndiObjectFactoryBean}. * It can be used for application components as well; however, * this is not common outside of infrastructure code. * * <p><b>NOTE:</b> FactoryBean objects participate in the containing * BeanFactory's synchronization of bean creation. There is usually no * need for internal synchronization other than for purposes of lazy * initialization within the FactoryBean itself (or the like). * * @author Rod Johnson * @author Juergen Hoeller * @since 08.03.2003 * @see org.springframework.beans.factory.BeanFactory * @see org.springframework.aop.framework.ProxyFactoryBean * @see org.springframework.jndi.JndiObjectFactoryBean */ public interface FactoryBean<T> { /** * Return an instance (possibly shared or independent) of the object * managed by this factory. * <p>As with a {@link BeanFactory}, this allows support for both the * Singleton and Prototype design pattern. * <p>If this FactoryBean is not fully initialized yet at the time of * the call (for example because it is involved in a circular reference), * throw a corresponding {@link FactoryBeanNotInitializedException}. * <p>As of Spring 2.0, FactoryBeans are allowed to return {@code null} * objects. The factory will consider this as normal value to be used; it * will not throw a FactoryBeanNotInitializedException in this case anymore. * FactoryBean implementations are encouraged to throw * FactoryBeanNotInitializedException themselves now, as appropriate. * @return an instance of the bean (can be {@code null}) * @throws Exception in case of creation errors * @see FactoryBeanNotInitializedException */ // 返回有FactoryBean创建的Bean实例,如果isSingleton为true,则该实例会放到Spring容器中 T getObject() throws Exception; /** * Return the type of object that this FactoryBean creates, * or {@code null} if not known in advance. * <p>This allows one to check for specific types of beans without * instantiating objects, for example on autowiring. * <p>In the case of implementations that are creating a singleton object, * this method should try to avoid singleton creation as far as possible; * it should rather estimate the type in advance. * For prototypes, returning a meaningful type here is advisable too. * <p>This method can be called <i>before</i> this FactoryBean has * been fully initialized. It must not rely on state created during * initialization; of course, it can still use such state if available. * <p><b>NOTE:</b> Autowiring will simply ignore FactoryBeans that return * {@code null} here. Therefore it is highly recommended to implement * this method properly, using the current state of the FactoryBean. * @return the type of object that this FactoryBean creates, * or {@code null} if not known at the time of the call * @see ListableBeanFactory#getBeansOfType */ // 返回FactoryBean创建Bean类型 Class<?> getObjectType(); /** * Is the object managed by this factory a singleton? That is, * will {@link #getObject()} always return the same object * (a reference that can be cached)? * <p><b>NOTE:</b> If a FactoryBean indicates to hold a singleton object, * the object returned from {@code getObject()} might get cached * by the owning BeanFactory. Hence, do not return {@code true} * unless the FactoryBean always exposes the same reference. * <p>The singleton status of the FactoryBean itself will generally * be provided by the owning BeanFactory; usually, it has to be * defined as singleton there. * <p><b>NOTE:</b> This method returning {@code false} does not * necessarily indicate that returned objects are independent instances. * An implementation of the extended {@link SmartFactoryBean} interface * may explicitly indicate independent instances through its * {@link SmartFactoryBean#isPrototype()} method. Plain {@link FactoryBean} * implementations which do not implement this extended interface are * simply assumed to always return independent instances if the * {@code isSingleton()} implementation returns {@code false}. * @return whether the exposed object is a singleton * @see #getObject() * @see SmartFactoryBean#isPrototype() */ // 返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype boolean isSingleton(); }
当配置文件中的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法返回的对象,相当于FactoryBean#getObject()代理了getBean
两者区别:
BeanFactory是一个factory,也就是IOC容器或对象工厂,FactoryBean是个Bean,在Spring中,所有的Bean都是由BeanFactory(IOC)来进行管理的。但对FactoryBean而言,这个Bean是一个生产或者修饰对象生成的工厂Bean,他的实现与设计模式中的工厂模式和修饰器模式类似。
相关文章推荐
- Javascrpt 页面工具
- 如何在spring官网上下载source code
- Java——集合工具类和jdk1.5有关集合的新特性
- Java作业整理 敏感词汇
- Spring, 基于自动代理实现aop
- spring mvc from表单上传后台实现方法(适用android/ios和jsp)
- JAVA多态学习1
- springmvc缓存
- java作业整理
- java细节总结
- springMVC注解方式+easyUI+MYSQL配置实例
- 通过ApplicationContextAware加载Spring上下文环境
- Java中堆内存和栈内存详解
- Eclipse常用快捷键
- java 对象与byte[]互转
- 多线程中synchronized作用
- myeclipse代码中出现 The word 'carousel' is not correctly spelled
- 堆排序(Java实现)
- myeclipse building workspace如何禁止及提高myeclipse速度
- java.security.AccessControlException: access denied (java.util.PropertyPermi