beanFactory与FactoryBean区别

beanFactory ioc容器接口,

FactoryBean 是一个bean,工厂类接口

  1. package org.springframework.beans.factory;  
  2. public interface FactoryBean<T> {  
  3.     T getObject() throws Exception;  
  4.     Class<?> getObjectType();  
  5.     boolean isSingleton();  
  6. }   

T getObject():返回由 FactoryBean 创建的 Bean 实例,如果 isSingleton() 返回 true ,则该实例会放到Spring 容器中单实例缓存池中;

boolean isSingleton():返回由 FactoryBean 创建的 Bean 实例的作用域是 singleton 还是 prototype ;

Class<T> getObjectType():返回 FactoryBean 创建的 Bean 类型。

当配置文件中<bean> 的 class 属性配置的实现类是 FactoryBean 时,通过 getBean() 方法返回的不是FactoryBean 本身,而是 FactoryBean#getObject() 方法所返回的对象,相当于 FactoryBean#getObject() 代理了getBean() 方法。


使用自定义方式创建一个bean,由getObject实现实例化,如果希望获取 FactoryBean 的实例,则需要在使用 getBean(beanName) 方法时在 beanName 前显示的加上 "&" 前缀:如 getBean("&car");


以Spring提供的ProxyFactoryBean为例子,配置如下:

[html]  view plain  copy
  1. <bean id="personServiceByLog" class="org.springframework.aop.framework.ProxyFactoryBean">  
  2.             <property name="proxyInterfaces">  
  3.                 <list>  
  4.                     <value>com.spring.service.PersonService</value>  
  5.                 </list>  
  6.             </property>  
  7.             <property name="interceptorNames">  
  8.                 <list>  
  9.                     <value>logInteceptor</value>  
  10.                     <value>ZFMethodAdvice</value>  
  11.                 </list>  
  12.             </property>  
  13.             <property name="targetName" value="personService" />    
  14.      </bean>  

那么在代码中根据personServiceByLog来获取的Bean实际上是PersonService类型的。 

[java]  view plain  copy
  1. @Test  
  2.  public void test01() {  
  3.   
  4.      PersonService ps = context.getBean("personServiceByLog", PersonService.class);  
  5.   
  6.      ps.sayHello();  
  7.   
  8.      String name = ps.getName();  
  9.   
  10.      System.out.println(name);  
  11.  }  

如果要获取ProxyFactoryBean本身,可以如下

[java]  view plain  copy
  1. @Test  
  2.  public void test04() {  
  3.      ProxyFactoryBean factoryBean = context.getBean("&personServiceByLog", ProxyFactoryBean.class);  
  4.      PersonService ps = (PersonService) factoryBean.getObject();  
  5.      String name = ps.getName();  
  6.      System.out.println(name);  
  7.   
  8.  }  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值