getBean("&sessionFactory")探究
今天遇到添加"&"符号的写法,获取LocalSessionFactoryBean
实例,于是跟踪代码看看其作用。
代码路径如下:
在getObjectForBeanInstance
中,有这样一个判断:
// Now we have the bean instance, which may be a normal bean or a FactoryBean.
// If it's a FactoryBean, we use it to create a bean instance, unless the
// caller actually wants a reference to the factory.
if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
其中BeanFactoryUtils.isFactoryDereference
是判断name
是否以"&“开头。这段的逻辑是,
如果不是继承自FactoryBean
,或者是以”&“开头,直接返回beanInstance
;换个说法,一个继承自FactoryBean
,并且
以”&"开头,会返回beanInstance
。这里beanInstance
是name
对应的实例,
在没有添加"&"时,代码逻辑会调用getObject
,其返回值为T
,从LocalSessionFactoryBean
的实现可以看到实现的
FactoryBean<SessionFactory>
,那么getObject
返回的是SessionFactory
。
总结,在继承自FactoryBean<T>
的类中,如果要获取类本身的实例,需要添加"&",否则,将会获得T的实例。