(181条消息) FactoryBean详解_MiaSanMiaRL的博客-CSDN博客_factorybean
FactoryBean也叫做Bean工厂,是用于生产Bean对象的类
FactoryBean的使用
首先我们要明确,FactoryBean也是一个Bean对象。我们如果要使用Bean工厂,可以手动实现一个实现FactoryBean接口的一个类。
@Component
public class FactoryBean_test implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
1、@Component:首先我们的Bean工厂由于也是对象的一种,所以我们要把它注册进Spring容器中
2、我们实现了FactoryBean接口
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
该接口有三个方法,其中isSingleton方法用来判断生产的Bean是不是单例的,默认实现,我们不需要手动实现。
我们需要实现getObject方法获得生产出来的Bean对象;同时还要实现getObjectType方法用于获取生产出来对象的类
使用:
在main方法中,我们依然用前面提到的方法获取Bean对象
//获取BeanDefinition对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
//简单的创建一个Bean
beanDefinition.setBeanClass(FactoryBean_test.class);
AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext();
//将BeanDefinition创建到容器对象里面去
applicationContext1.registerBeanDefinition("user",beanDefinition);
//注意:此时我们注册进Spring中的Bean有些特殊,他实现了两个实际上创建了两个Bean对象,第一个就是我们的FactoryBean_teat,
//还有一个就是我们的User对象
//此时id:&user表示的是FactoryBean_teat,id:user表示的是User对象。
注意:
我们此时传入的BeanDefinition对象会有点特殊,因为它实际上会注册进两个Bean对象,一个是我们的工厂对象,另一是我们生产出来的对象。
//获取生产出来的对象
User user1 = applicationContext1.getBean("user",User.class);
//获取工厂对象
FactoryBean_test factoryBean_test = applicationContext1.getBean("&user",FactoryBean_test.class);