个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~
FactoryBean 机制
一、什么是 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
代码语言:javascript复制 <bean id="myFactoryBean" class="com.haojin.ioc.demo.MyFactoryBean">
<!--依旧可以通过setXxx()方式注入属性值-->
<property name="serviceName" value=".29."></property>
</bean>
测试FactoryBean效果
:
getBean()获取的类型并非:MyFactoryBean,而是FactoryBean接口泛型类型:service
代码语言:javascript复制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());
}
}