使用 FactoryBean 進行動態 bean 例項化

為了動態決定注入哪些 bean,我們可以使用 FactoryBeans。這些是實現工廠方法模式的類,為容器提供 bean 例項。它們被 Spring 識別並且可以透明地使用,而不需要知道 bean 來自工廠。例如:

public class ExampleFactoryBean extends AbstractFactoryBean<String> {
    // This method determines the type of the bean for autowiring purposes
    @Override
    public Class<?> getObjectType() {
        return String.class;
    }

    // this factory method produces the actual bean
    @Override
    protected String createInstance() throws Exception {
        // The thing you return can be defined dynamically,
        // that is read from a file, database, network or just
        // simply randomly generated if you wish.
        return "Something from factory";
    }
}

組態:

@Configuration
public class ExampleConfig {
    @Bean
    public FactoryBean<String> fromFactory() {
        return new ExampleFactoryBean();
    }
}

得到豆子:

AbstractApplicationContext context = new AnnotationConfigApplicationContext(ExampleConfig.class);
String exampleString = (String) context.getBean("fromFactory");

要獲取實際的 FactoryBean,請在 bean 的名稱前使用&符號字首:

FactoryBean<String> bean = (FactoryBean<String>) context.getBean("&fromFactory");

請注意,你只能使用 prototypesingleton 範圍 - 將範圍更改為 prototype override isSingleton 方法:

public class ExampleFactoryBean extends AbstractFactoryBean<String> {
    @Override
    public boolean isSingleton() {
        return false;
    }

    // other methods omitted for readability reasons
}

請注意,作用域指的是建立的實際例項,而不是工廠 bean 本身。