Spring:从工厂动态实例化bean

时间:2016-03-16 16:11:32

标签: spring spring-boot spring-bean

是否可以使用工厂在Spring中动态实例化bean?

我希望能够在检测到特定注释时实例化一些bean。

E.g。

@Retention ( RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE)
@Import(CreateFooRegistrar.class)
public @interface CreateFoo {
    String name();
}

public interface Foo {
    String getName();
    void setName(String name);
}

public class FooImpl implements Foo {
    ...
}

我可以使用具体类直接创建bean:

public class CreateFooRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(CreateFoo.class.getName()));
        String fooName =  attributes.getString("name");
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(FooImpl.class);
        builder.addPropertyValue("name", fooName);
        registry.registerBeanDefinition(fooName + "Foo", builder.getBeanDefinition());
    }
}

但是有什么方法可以使用工厂返回的对象创建bean吗?

E.g。

public class FooFactory {
    public static FooImpl create(String name) {
        FooImpl foo = new FooImpl();
        foo.setName(name);
        return foo;
    }
}

我问的原因是我想要自动创建的所有bean通常都是通过工厂实例化的。我不拥有工厂代码,所以我不想尝试自己模仿其内部工作。

0 个答案:

没有答案