一般我们在spring中注册一个bean,直接

<bean id="websocket" class="com.sdyy.common.spring.websocket.WebsocketEndPoint"/>


这样会用WebsocketEndPoint的构造方法(这种是无参),为我们创建一个对象bean。


————————————————————————————分界线—————————————————————————————————————————————


但是还有一种方式,用bean工厂注册bean的,有三种写法,我们先看第一种:


第一种写法以及实例解析:

拿著名的Ehcahce,在spring里注册的方式来说,它在spring里是这样写的:

<bean id="realCache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:cache/ehcache.xml" />
</bean>


但是最后你会发现最后生成的​名为realCache​的bean是一个​net.sf.ehcache.CacheManager​类的对象,而非​org.springframework.cache.ehcache.EhCacheManagerFactoryBean

这是因为​EhCacheManagerFactoryBean​实现了spring的​FactoryBean​接口

spring bean注册之bean工厂方式_spring

 FactoryBean有三个方法要求实现

spring bean注册之bean工厂方式_spring_02

其中getObject​方法返回的结果才会作为真正的注册结果bean返回给spring​​我们来看一下

org.springframework.cache.ehcache.EhCacheManagerFactoryBean 的 getObject方法返回了什么:

spring bean注册之bean工厂方式_spring_03

spring bean注册之bean工厂方式_sed_04

spring bean注册之bean工厂方式_spring_05

是的,就是​net.sf.ehcache.CacheManager。


ps:如果想要获取​EhCacheManagerFactoryBean​本身:

1、可以根据类型注入即直接使用@Autowired,

2、或者使用ApplicationContext的getBean(EhCacheManagerFactoryBean.class);

3、或者使用ApplicationContext的getBean("​&realCache​",EhCacheManagerFactoryBean.class);  这里的id就是xml里面写的id,特别注意前边的“&”


第二、三种写法:

通过工厂bean还可以写:

写法一:
<bean id="factoryBean" class="com.demo.BaseBeanFactory"></bean>

<bean id="bean" factory-bean="factoryBean" factory-method="createBaseDao"></bean>

写法二:
<bean id="bean" class="com.demo.BaseBeanFactory" factory-method="createBaseDao"></bean>

factory-method指的就是哪个方法来创建bean,这里就不要求继承FactoryBean了




完毕!