赞
踩
FactoryBean也叫做Bean工厂,是用于生产Bean对象的类
首先我们要明确,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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。