大家都知道可以通过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这样的类可能有特殊处理,但不知道是如何实现的,求讲解,求思路!
多谢
如果容器发现一个bean class是一个FactoryBean实现类,他仍然会是实例化这个FactoryBean,对他进行注入,但实际的bean对象则是是由这个FactoryBean实例来创建,除了创建实例的方法,FactoryBean本身有方法返回他创建的实例的类型和表示创建的实例是否是单例。
更多细节,建议你在自己实现的FactoryBean里面打上断点调试,沿着调用栈查看Spring的源代码比口头问好很多。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。