一、什么是 FactoryBean ?
FactoryBean 是 Spring 提供的一种整合第三方框架的常用机制。
当获取普通的bean时,得到的是我们在bean标签中class属性所配置的类的对象;
当获取FactoryBean类型的bean,得到的是getObject()方法的返回值,这个返回值是可由开发者自定义的。
通过这种机制,Spring 可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来,只把最简洁的使用界面展示给我们。
二、实现 FactoryBean 接口
- 创建一个FactoryBean 的实现类,重写其抽象方法。
- 实现FactoryBean接口时需要指定泛型
- 泛型类型就是当前工厂要生产的对象的类型
package com.haojin.ioc.demo; import org.springframework.beans.factory.FactoryBean; /** * @author .29. * @create 2023-01-19 11:54 */ //由FactoryBean的泛型决定bean获取到的对象 public class MyFactoryBean implements FactoryBean<service> { private String serviceName; public String getServiceName() { return serviceName; } public void setServiceName(String serviceName) { this.serviceName = serviceName; } @Override public service getObject() throws Exception { //这里模拟创建、设置一个对象的过程 service service = new service(); service.setServiceName(this.serviceName); return service; } @Override public Class<?> getObjectType() { //返回要生产的对象类型 return service.class; } }
XML配置文件中配置bean
:
class属性:com.haojin.ioc.demo.MyFactoryBean
<bean id="myFactoryBean" class="com.haojin.ioc.demo.MyFactoryBean"> <!--依旧可以通过setXxx()方式注入属性值--> <property name="serviceName" value=".29."></property> </bean>
测试FactoryBean效果
:
getBean()获取的类型并非:MyFactoryBean,而是FactoryBean接口泛型类型:service
public class testFactoryBean { @Test public void test(){ //class属性设置的是:MyFactoryBean,这里bean获取到的是service ApplicationContext factorybean = new ClassPathXmlApplicationContext("factorybean.xml"); service myFactoryBean = factorybean.getBean("myFactoryBean", service.class); System.out.println(myFactoryBean); System.out.println(myFactoryBean.getServiceName()); } }