spring 使用FactoryBean注入bean
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的实例@Overridepublic Person getObject() throws Exception {return new Person("123");}//3.重写的第二个方法返回Bean的类型@Overridepublic Class<?> getObjectType() {return Person.class;}//4.重写的第三个方法返回一个boolean值,决定该Bean的类型是单例还是多实例。这里返回true,为单例。@Overridepublic 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*/@Beanpublic MyFactoryBean PersonBean(){//这里的方法名称是Person类Bean的IDreturn 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类