我有一个自定义的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();
}
......
它让我觉得。。。。。更好。
暂无答案!
目前还没有任何答案,快来回答吧!