关于springbean初始化的顺序

wecizke3  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(241)

我有一个自定义的spring boot starter项目,由rest controller使用,auto configuration类用于创建几个(根据application.yml中的config值)存储上下文示例作为spring singleton,所以我必须在beanfactoryaware的setbeanfactory方法中动态创建它们,方法是:

@Import(StorageContextProperties.class)
public class StorageAutoConfiguration implements BeanFactoryAware {

      ......

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

         ......

         StorageContextProperties config = beanFactory.getBean(StorageContextProperties.class);

         config.getProfiles().stream().forEach(p ->  {

              ......

              ((SingletonBeanRegistry) beanFactory).registerSingleton(profile.name, instance);

问题是在controller@autowired事件之前没有调用这个方法,所以它会抱怨没有storagecontext示例,我也尝试过beanfactorypostprocessor和initializingbean接口,它们都不起作用。
但是,我注意到如果我只是在auto-config类中添加一些特殊的@bean方法,比如:

@Import(StorageContextProperties.class)
public class StorageAutoConfiguration implements BeanFactoryAware{

    @Bean
    public MethodValidationPostProcessor validationPostProcessor2() {
        return new MethodValidationPostProcessor();
    }

    ......

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

然后在控制器之前调用setbeanfactory(),看来spring需要methodvalidationpostprocessor示例,所以创建了singleton bean的共享示例:storageautoconfiguration,还创建了storagecontextproperties示例,调用setbeanfactory()。
如果我添加上面的@bean方法,代码就可以工作。好吧,事情在这方面也很顺利,但我不喜欢这种风格,因为我实际上不需要methodvalidationpostprocessor。
有什么优雅的方法(没有@bean方法)来实现它吗?
我的要求是:
在控制器创建事件之前。
1创建storagecontextproperties(它是@import的@configurationproperties类)2一些回调我可以调用registersingleton()来创建我的存储上下文示例
谢谢!
[更新1]
我仍然找不到任何方法使其工作,但我将代码更改为:

@Configuration
@Import(StorageContextProperties.class)
@ConditionalOnProperty(prefix = "avalon.thiton.storage.config", name = "masterKey")
public class StorageAutoConfiguration implements BeanFactoryAware {

    private static Logger log = LoggerFactory.getLogger(StorageAutoConfiguration.class);

    @Bean
    @Order(Ordered.LOWEST_PRECEDENCE)
    @ConditionalOnMissingBean(MethodValidationPostProcessor.class)
    public MethodValidationPostProcessor placeholder() {
        return new MethodValidationPostProcessor();
    }

    ......

它让我觉得。。。。。更好。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题