开发者社区 问答 正文

问一个Spring注入Bean的问题

大家都知道可以通过spring的xml文件的形式来管理Bean,通常情况下,比如有一个类叫做com.athena.beans.MyBean,那么我们可以在xml文件中这样配置:

<bean id="myBean" class="com.athena.beans.MyBean">
然后在需要使用该Bean的java类中,可以使用@Resource等注解来让Spring帮助注入该Bean的实例。

一般,通过bean节点配置后生成的实例都是class属性值中类的一个对象,也就是说上面配饰的MyBean,在生成后的实例,肯定是MyBean类型的。

但有下面的一个配置让我很迷茫:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" value="classpath:prop.properties"/>
    </bean>

PropertiesFactoryBean

而生成的类型却是:Properties类型,它的使用代码如下:

@Resource
 private Properties properties;

而我原以为应该这样使用:

@Resource
private PropertiesFactoryBean properties;
也就是说,properties的类型应该是在xml中配置时候的class值的类型才对。。。
但实际使用的时候会报错,只有当把它声明为Properties类型的时候才正确。。。。

我知道可能是Spring对于FactoryBean这样的类可能有特殊处理,但不知道是如何实现的,求讲解,求思路!

多谢

展开
收起
a123456678 2016-03-16 15:33:15 2263 分享 版权
1 条回答
写回答
取消 提交回答
  • 如果容器发现一个bean class是一个FactoryBean实现类,他仍然会是实例化这个FactoryBean,对他进行注入,但实际的bean对象则是是由这个FactoryBean实例来创建,除了创建实例的方法,FactoryBean本身有方法返回他创建的实例的类型和表示创建的实例是否是单例。

    更多细节,建议你在自己实现的FactoryBean里面打上断点调试,沿着调用栈查看Spring的源代码比口头问好很多。

    2019-07-17 19:04:01
    赞同 展开评论