一、FactoryBean 接口
package org.springframework.beans.factory;
import org.springframework.lang.Nullable;
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
方法简单明了,不过多介绍
二、案例
创建 MyFactoryBean,实现 FactoryBean 接口
package org.example.condition;
import org.example.pojo.Color;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean<Color> {
public Color getObject() throws Exception {
return new Color();
}
public Class<?> getObjectType() {
return Color.class;
}
public boolean isSingleton() {
return true;
}
}
在配置类中配置 MyFactoryBean
package org.example.config;
import org.example.condition.MyFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FactoryBeanTestConfig {
@Bean
public MyFactoryBean myFactoryBean(){
return new MyFactoryBean();
}
}
测试方法:
@Test
public void testFactoryBean(){
ApplicationContext ac = new AnnotationConfigApplicationContext(FactoryBeanTestConfig.class);
Object myFactoryBean = ac.getBean("myFactoryBean");
Object myFactoryBean1 = ac.getBean("myFactoryBean");
System.out.println(myFactoryBean.getClass());
System.out.println(myFactoryBean1.getClass());
System.out.println(myFactoryBean == myFactoryBean1);
Object bean = ac.getBean("&myFactoryBean");
System.out.println(bean);
}
测试方法:
分析:
- 我们向容器中注入的是 MyFactoryBean,但是在通过 id 获取 bean 的时候,获取到的却是工厂 bean 调用 getObject 创建的 Color 对象。如果想要获取 MyFactoryBean,可以在 id 前加 ”&“,来看一下 FactoryBean 中关于 ”&“ 作用的解释:
"&"主要是用来解引用并且区分 FactoryBean 与 由 FactoryBean 创建的 bean 。例如,如果一个名叫 myJndiObject 的 FactoryBean,通过”&myJndiObject“将会获取到创建工厂 bean 的工厂,而不是由该工厂创建的实例。 - 当 MyFactoryBean 中设置为单实例时,两次获取到的结果是一致的。