spring 使用FactoryBean注入bean
1、介绍
通常是ApplicationContext,就是IOC容器,ApplicationContext是BeanFactory的实现类,是spring最核心的接口。用getBean来加载bean。BeanFactory相当于是IOC的基础类。而FactoryBean是另一个东西,可以用来手动注入类实例,但又与BeanFactoryPostProcessor等spring提供的扩展点不同,本身没有固定的触发时机。
FactoryBean
是作为普通Bean初始化,其目标对象的创建遵循 Spring 容器的标准生命周期,具体取决于作用域和调用时机。
2、 FactoryBean
核心作用
FactoryBean
是 Spring 框架中用于创建复杂对象的工厂接口,它允许开发者通过编程方式定制 Bean 的创建逻辑,相当于工厂模式:实现此接口的类不是普通的 Bean,而是一个能生产其他 Bean 的工厂。工厂本身由 Spring 容器管理生命周期(初始化、销毁)。
3、核心方法
T getObject() throws Exception
返回由工厂创建的对象实例。
Class<?> getObjectType()
返回工厂创建的对象类型
boolean isSingleton()
指示 getObject()
返回的对象是否为单例。
4、FactoryBean注入类实例
//1. 这里的接口泛型参数为要注入Bean的类型
public class MyFactoryBean implements FactoryBean<Person> {
//2.重写的第一个方法返回Bean的实例
@Override
public Person getObject() throws Exception {
return new Person("123");
}
//3.重写的第二个方法返回Bean的类型
@Override
public Class<?> getObjectType() {
return Person.class;
}
//4.重写的第三个方法返回一个boolean值,决定该Bean的类型是单例还是多实例。这里返回true,为单例。
@Override
public boolean isSingleton() {
return true;
}
}
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Configuration
public class FactoryBeanConfig {
/**
* 把MyFactoryBean类的Bean注入容器,即实现了把Person类Bean注入容器。
* @return
*/
@Bean
public MyFactoryBean PersonBean(){//这里的方法名称是Person类Bean的ID
return new MyFactoryBean();
}
}
测试代码
ApplicationContext applicationContext = SpringApplication.run(BasicApplication.class, args);
// 测试通过继承factorybean方式注入IOC容器
Person personBean = (Person)applicationContext.getBean("PersonBean");
System.out.println(personBean.getName());
5、应用场景
1、需特殊初始化的组件的对象
FactoryBean
适合需要复用创建逻辑的场景。如mybatis组件的SqlSessionFactoryBean类