简单实现一下如何手动注册BeanDefinition,从而让beanFactory返回给我们一个spring容器管理的单例bean(如果不显示设置,默认为单例)。首先让一个类注解为@Component的类实现接口BeanFactoryAware,实现如下方法,从而获取beanFactory:

@Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

        DefaultListableBeanFactory factory=(DefaultListableBeanFactory)beanFactory;

        MutablePropertyValues values=new MutablePropertyValues();
        values.add("name","my dog haha ");

        BeanDefinition definition=new RootBeanDefinition(Dog.class,null,values);

        factory.registerBeanDefinition("dog",definition);
        Dog dog=(Dog)factory.getBean("dog");
        System.out.print(dog.getName());

    }

      之所以把BeanFactory转换成DefaultListableBeanFactory是因为此类实现了接口BeanDefinitionRegistry,这个接口中有注册BeanDefinition的方法。

      把需要的实例化的类的属性以property:value的形式放入MutablePropertyValues中,然后放入BeanDefinition中,同时指定要实例化的类类型。

     调用beanFactory注册BeanDefinition,调用getBean获取Dog单例对象。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐