如何为动态bean

时间:2016-05-09 13:48:20

标签: caching spring-boot guava

我正在使用“AutowireCapableBeanFactory”创建一个动态bean,如下所示

RegisterFoo.java

@Configuration
public class registerFoo {
    @Autowired
    ApplicationContext appcontext;

    AutowireCapableBeanFactory bf;

    @PostConstruct
    public void registerFoo() {
        bf = appContext.getAutowireCapableBeanFactory();
        RootBeanDefinition def = new RootBeanDefinition(Foo.class);
        ((DefaultListableBeanFactory)bf).registerBean("foo", def);
    }
}

RegisterBar.java

@Configuration
public class registerBar {
    @Autowired
    ApplicationContext appcontext;

    AutowireCapableBeanFactory bf;

    @PostConstruct
    public void registerFoo() {
        bf = appContext.getAutowireCapableBeanFactory();
        RootBeanDefinition def = new RootBeanDefinition(Bar.class);
         Foo foo = (Foo) appContext.getBean("foo");
        ConstructorArgumentValues cav = new ConstructorArgumentValues();
        cav.add(0, foo.getValue());
        def.setArgumentValues(cav);
        ((DefaultListableBeanFactory)bf).registerBean("bar", def);
    }
}

让Foo.class

public class Foo {
    @Cacheable
    public String getValue() {
        // return value
    }
}

方法getValue()每次都执行它的主体。 Spring不会按预期缓存值。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为问题是当spring注册一个带注释的bean时,它会被一个管理@Cacheable的bean后处理器进行后处理

手动注册时,后处理可能无法完成。

暂时无法验证,但这是我首先要查看的地方。

希望得到这个帮助。