FactoryBean接口简介
FactoryBean接口是Spring提供的工厂类接口,实现这个接口的实现类拥有一些Spring提供的Bean基本功能。
泛型定义的是产生对象的类型。
FactoryBean接口定义了3个方法:
- getObjectType:返回的是被创建对象的Class
- getObject:返回的是被创建对象的实例
- isSingleton:被创建的对象是否单例
FactoryBean是懒加载的,容器启动的时候,工厂不会生产对象,直到使用到对象的时候,才会创建对象。
1 | /** |
使用XML方式生产bean
在xml中配置需要使用的工厂bean,就可以通过IOC容器获取到该工厂生产的对象。
1 |
|
1 | public static void main(String[] args) { |
从运行结果看,通过myFactoryBean获取到的不是工厂的实现类,而是工厂产生的对象Book类型,而且由于isSingleton方法返回的是false,生产的对象不是单例的。
有什么办法可以获取到工厂的实现类本身吗?
在BeanFactory接口里定义了这么一个属性:
1 | public interface BeanFactory { |
通过&id可以获取到工厂类本身,而不是工厂类产生的对象实例。且Spring中产生的bean默认是单例的。
1 | Object bean1 = applicationContext.getBean("&myFactoryBean"); |
使用注解方法生产对象
同XML方式一样,只需要把实现的工厂类加入到IOC容器中,就可以通过容器获取工厂生产的对象。
这里使用@Component加入到IOC容器中。
1 |
|
此时,是通过注解的方式获取ApplicationContext,不再是通过xml的ClassPathXmlApplicationContext.
1 | public static void main(String[] args) { |
从结果可以看到,使用注解的方式同样可以获取到工厂类产生的对象。同样的,如果需要获取到工厂的实现类,只需要通过applicationContext.getBean(“&myFactoryBean”)获取。