factorybean的解释
介绍:
一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。
FactoryBean接口对于Spring框架来说占有重要的地位,Spring 自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂bean的细节,给上层应用带来了便利。从Spring 3.0 开始, FactoryBean开始支持泛型,即接口声明改为FactoryBean<T> 的形式
实现factorybean 接口 主要有3个方法如下;
package com.quartz.job;
import org.springframework.beans.factory.FactoryBean;
public class JobFactoryBean implements FactoryBean<MyJob>{
@Override
public MyJob getObject() throws Exception {
// TODO 实际factorybean 返回的值
return null;
}
@Override
public Class<?> getObjectType() {
// TODO 返回值的class
return MyJob.class;
}
@Override
public boolean isSingleton() {
// TODO 指定是否单列 默认是false
return true;
}
}
当我们使用spring 容器 获取时比如使用注解
@Autowired JobFacotryBean jobFacoryBean 获取时 我们获取到的是JobFacotryBean的实例 因为@Autowired 是按照类型来获取的
使用@Resource 注解
@Resource JobFacotryBean jobFacoryBean 这样的写法是不正确的 应为这时我们获取的是MyJob的实例应改为@Resource MyJob jobFacoryBean 不然会出现注入类型错误
如果我们想获取JobFacotryBean的实例需要是&符号和名字一起使用如下:
@Resource (name="&jobFacoryBean")
JobFacotryBean jobFacoryBean
这样获取的才是JobFacotryBean的实例
使用getBean的方式获取 也是一样 获取JobFacotryBean实例 getBean("&jobFacoryBean")
获取泛型的实例 就是本例子中的MyJob 使用getBean("jobFacoryBean")
factorybean 和beanfactory 是不一样的概念主要的前者代表着是一个bean 后者表示的是一个bean工厂