spring BeanFactory 实现类的getBean方法

本文探讨了Spring框架中AOP(面向切面编程)的实现方式,通过配置文件定义代理工厂Bean,实现接口方法拦截及前置通知等功能,展示了如何通过Spring的BeanFactory获取特定的Bean实例。

原文:http://blog.163.com/kangzye/blog/static/3681922320096625822733/

 

这个方法是返回一个对象实例根据一个id或者name,这个id 或者 name 将会在配置文件里出现如:

<bean id="abc" class="com.yourcompany.Abc"></bean>

系统会根据给出的class属性构造一个实例出来,然后强制转换:

BeanFactory factory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Abc abc=(Abc)factory.getBean("abc");
但有看过这样的代码:
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"> 
   <value>com.ascenttech.springaop.test.Bean</value> 
  </property> 
  <property name="target"> 
   <ref local="beanTarget"/> 
  </property> 
  <property name="interceptorNames"> 
   <list> 
    <value>theAdvisor</value> 
   </list> 
  </property>
</bean>
<bean id="theBeforeAdvice" class="com.ascenttech.springaop.test.TestBefore Advice"/>
<!--CLASS-->
<bean id="beanTarget" class="com.ascenttech.springaop.test.BeanImpl"/>
<!--ADVISOR-->
<!--Note: An advisor assembles pointcut and advice-->
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
  <property name="advice"> 
   <ref local="theBeforeAdvice"/> 
  </property> 
  <property name="pattern"> 
   <value>com\.ascenttech\.springaop\.test\.Bean\.theMethod</value> 
  </property>
</bean>

Bean 为自定义接口, 以及其实现类省略未给出
Bean x = (Bean) ctx.getBean("bean");
从 配置文件可以看出 id 为 bean 的是 org.springframework.aop.framework.ProxyFactoryBean ,但却试着往 Bean 转型,从一般来看这样势必产生 ClassCastException 类型转换错误,但事实却不会出错,因为getBean 方法不是简单的有构造器构造一个对象实例,而是这样: 如果 bean 的class 继承了 spring框架中的 FactoryBean 接口,那么getBean 先构造一个 bean 中class指定的对象,然后调用这个对象的 getObject 方法,getObject 方法返回一个  Object ,这个Object 就是 getBean 实际返回的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值