开发者社区> 问答> 正文

问一个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 2145 0
1 条回答
写回答
取消 提交回答
  • 如果容器发现一个bean class是一个FactoryBean实现类,他仍然会是实例化这个FactoryBean,对他进行注入,但实际的bean对象则是是由这个FactoryBean实例来创建,除了创建实例的方法,FactoryBean本身有方法返回他创建的实例的类型和表示创建的实例是否是单例。

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

    2019-07-17 19:04:01
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多