实践使用FactoryBean向容器中注入bean

366 阅读1分钟

演示demo

1)FactoryBean的实现类

/**
 * description:
 * 利用PersonFactoryBean注入一个实例
 * author:dingyawu
 * date:created in 22:40 2020/12/5
 * history:
 */
public class PersonFactoryBean implements FactoryBean<Person> {

    //返回一个Person对象,这个对象会被注册到Spring容器中
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    //bean是否为单例;true:是;false:否
    @Override
    public boolean isSingleton() {
        return true;
    }
}

2)将实现类包装成配置类

/**
 * description:
 * author:dingyawu
 * date:created in 23:37 2020/12/4
 * history:
 */
@Configuration
public class PersonConfig11 {
    @Bean
    public PersonFactoryBean personFactoryBean(){
        return new PersonFactoryBean();
    }
}

3)测试类

/**
 * 测试PersonFactoryBean这个实例 personFactoryBean实例的类型为:class com.roy.beans.Person,
 * 演示如何在Spring容器中获取到FactoryBean对象
 */
@Test
public void testPersonFactoryBean() {
  ApplicationContext ac = new AnnotationConfigApplicationContext(PersonConfig11.class);
  String[] names = ac.getBeanDefinitionNames();
  Arrays.stream(names).forEach(System.out::println);

  Object personFactoryBean = ac.getBean("personFactoryBean");
  System.out.println("personFactoryBean实例的类型为:" + personFactoryBean.getClass());

  Object personFactoryBean3 = ac.getBean("&personFactoryBean");
  System.out.println("personFactoryBean3类型:" + personFactoryBean3.getClass());
}

说明的几个点

测试demo中分别演示了如何获取FactoryBean的实现类的bean和FactoryBean的实现类的getObject返回对象的bean

myBatis也是通过这种方式联合Spring的