Spring之FactoryBean
来源:互联网 发布:淘宝客的赚钱之道 编辑:程序博客网 时间:2024/05/21 21:43
由Spring的bean容器管理的并且实现了FactoryBean接口的类实例本身也是一个bean factory,通过spring的bean容器的getBean()方法获得bean实例时,实际上获得的是这个bean factory生产出来的实例对像,而非这个bean factory本身,但在getBean()指定的beanName前加上"&"符号就获得了这个bean factory本身的实例.在spring框架中就有很多地方使用了FactoryBean,例如 org.springframework.aop.framework.ProxyFactoryBean等.下面介绍几个spring框架已提供的常用 的FactoryBean.
MethodInvokingFactoryBean :简言之为没有实现FactoryBean的应用bean提供工厂功能,即通过指定目标类或实现及相应的方法名称(如果需要方法参数还要提供相应参数),就可以获得该方法的返回值.
具体来说,MethodInvokingFactoryBean把静态或实例方法调用的返回值作为自己的返回对象.尽管推荐使用容器内置的工厂方法 来达到相同的目的,但当你要调用的工厂方法没有返回值时,使用MethodInvokingFactoryBean或许会给你带来帮助,因为内置的工厂方 法作为bean容器的一部分,是为了对外提供实例,故而不支持没有返回值的场景.
MethodInvokingFactoryBean依赖于InitializingBean.afterPropertiesSet(),即当 BeanFactory完成所有的属性设置后,会调用InitializingBean的afterPropertiesSet()方法来实现一些个性化 的初始化过程.MethodInvokingFactoryBean实现了InitializingBean,并且在其 afterPropertiesSet()方法中对于singleton bean执行方法调用,如下:
- public void afterPropertiesSet() throws Exception {
- prepare();
- if (this.singleton) {
- this.initialized = true;
- this.singletonObject = doInvoke();
- }
- }
MethodInvokingFactoryBean支持静态方法调用和实例方法调用,其唯一不同在于前者需要提供targetClass,而后者需要提供targetObject,分别配置如下:
- 静态调用方式一:
- <bean id="myObject" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="staticMethod">
- <value>com.enjiex.MyFactory.getInstance</value>
- </property>
- </bean>
- 静态调用方式二:
- <bean id="myObject" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="targetClass">
- <value>com.enjiex.MyFactory</value>
- </property>
- <property name="targetMethod">
- <value>getInstance</value>
- </property>
- </bean>
- 实例调用方式:
- <bean id="myObject" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="targetObject">
- <value>myFactory</value>
- </property>
- <property name="targetMethod">
- <value>getInstance</value>
- </property>
- <!--
- 如果有必要可指定arguments属性用于设置方法参数
- -->
- </bean>
不管哪种方式,当需要myObject bean时,实际返回的是targetObject.getInstance()或者targetClass.getInstance()
MethodInvokingFactoryBean相当于对FactoryBean提供了个性化的实现,当应用需要使用FactoryBean的 时候,即不用实现FactoryBean并使用指定的getObject方法,也不用继承和框架相关的类,降低了业务应用与框架的耦合.
转载地址:http://enjiex.blogbus.com/logs/199504575.html?
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean接口
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Spring bean 之 FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- spring学习之FactoryBean
- Spring之FactoryBean
- Spring之FactoryBean
- Android项目小结---闹铃备忘录小开发知识点(附有:源码下载)
- oracle spfile和pfile详解
- 嵌入式LINUX环境下视频采集知识
- 什么是野指针?
- u-boot运行分析(四)(转帖) .
- Spring之FactoryBean
- Location-Based Services Using CellID in Android
- MemoryHeapBase内存分配、Ashmem_create_Region mmap申请共享内存
- 描述符的总结
- Android ashmem的实现方式
- 指定长度的strstr函数
- jquery学习总结(精华版)
- Android MMS 源码流程
- 微软安全新闻聚焦-双周刊第十八期