BeanDefinitionRegistryPostProcessor的实现类中注入不了类
原创 2022-02-15 10:52 阅读(1716)次
最近在用BeanDefinitionRegistryPostProcessor实现接口生成动态代理的功能,BeanDefinitionRegistryPostProcessor的实现类中想取的配置类,但发现一直取不到springboot中的配置。
配置类代码如下:
@Data
@Component
@ConfigurationProperties("my.netty.feign")
public class NettyFeignConfig {
/**
* netty feign扫瞄的目录
*/
private String pack;
/**
* netty feign调用的超时时间,默认30秒
*/
private Integer timeout;
}
NettyFeignConfig对应的配置如下:
my:
netty:
feign:
timeout: 40
pack: com.my
然后在BeanDefinitionRegistryPostProcessor的实现类中注入上面的类NettyFeignConfig,代码如下:
@Component
public class NettyFeignClientProxyBeanRegistry implements BeanDefinitionRegistryPostProcessor {
private static final Logger logger = LoggerFactory.getLogger(NettyFeignClientProxyBeanRegistry.class);
@Resource
private NettyFeignConfig nettyFeignConfig;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
throws BeansException {
//定义NettyFeignClient扫描器
NettyFeignClientBeanDefinitionScanner scanner =
new NettyFeignClientBeanDefinitionScanner(beanDefinitionRegistry,
false,applicationContext);
scanner.scan(nettyFeignConfig.getPack());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
}
结果调试时发现nettyFeignConfig注入后取不到application.yml中的my.netty.feign配置,如下图:
查了下资料才发现BeanDefinitionRegistryPostProcessor的实现类中不能注入其他类的实例,否则会过早的实例化这些注入的bean,导致实例化这些类不能正常使用。具体原理可以看我下一篇文章:http://www.classinstance.cn/detail/179.html
那问题很明了了,我要解决BeanDefinitionRegistryPostProcessor的实现类中注入不了配置类,就只能实现EnvironmentAware接口,再用Environment来取配置了。代码如下:
@Component
public class NettyFeignClientProxyBeanRegistry implements BeanDefinitionRegistryPostProcessor ,ApplicationContextAware,EnvironmentAware {
private static final Logger logger =
LoggerFactory.getLogger(NettyFeignClientProxyBeanRegistry.class);
private Environment environment;
private ApplicationContext applicationContext;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
throws BeansException {
//定义NettyFeignClient扫描器
NettyFeignClientBeanDefinitionScanner scanner =
new NettyFeignClientBeanDefinitionScanner(beanDefinitionRegistry,
false,applicationContext);
//scanner.setResourceLoader(resourceLoader);
//scanner.registerFilters();
scanner.scan(environment.getProperty("my.netty.feign.pack"));//com.tianlong
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}
上一篇:Clickhouse批量删除分区