BeanDefinitionRegistryPostProcessor的实现类中注入不了类

原创 2022-02-15 10:52 阅读(1716)次

最近在用BeanDefinitionRegistryPostProcessor实现接口生成动态代理的功能,BeanDefinitionRegistryPostProcessor的实现类中想取的配置类,但发现一直取不到springboot中的配置。
配置类代码如下:

  1. @Data
  2. @Component
  3. @ConfigurationProperties("my.netty.feign")
  4. public class NettyFeignConfig {
  5. /**
  6. * netty feign扫瞄的目录
  7. */
  8. private String pack;
  9. /**
  10. * netty feign调用的超时时间,默认30秒
  11. */
  12. private Integer timeout;
  13. }

NettyFeignConfig对应的配置如下:

  1. my:
  2. netty:
  3. feign:
  4. timeout: 40
  5. pack: com.my

然后在BeanDefinitionRegistryPostProcessor的实现类中注入上面的类NettyFeignConfig,代码如下:

  1. @Component
  2. public class NettyFeignClientProxyBeanRegistry implements BeanDefinitionRegistryPostProcessor {
  3. private static final Logger logger = LoggerFactory.getLogger(NettyFeignClientProxyBeanRegistry.class);
  4. @Resource
  5. private NettyFeignConfig nettyFeignConfig;
  6. @Override
  7. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
  8. throws BeansException {
  9. //定义NettyFeignClient扫描器
  10. NettyFeignClientBeanDefinitionScanner scanner =
  11. new NettyFeignClientBeanDefinitionScanner(beanDefinitionRegistry,
  12. false,applicationContext);
  13. scanner.scan(nettyFeignConfig.getPack());
  14. }
  15. @Override
  16. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
  17. throws BeansException {
  18. }
  19. }

结果调试时发现nettyFeignConfig注入后取不到application.yml中的my.netty.feign配置,如下图:

查了下资料才发现BeanDefinitionRegistryPostProcessor的实现类中不能注入其他类的实例,否则会过早的实例化这些注入的bean,导致实例化这些类不能正常使用。具体原理可以看我下一篇文章:http://www.classinstance.cn/detail/179.html
那问题很明了了,我要解决BeanDefinitionRegistryPostProcessor的实现类中注入不了配置类,就只能实现EnvironmentAware接口,再用Environment来取配置了。代码如下:

  1. @Component
  2. public class NettyFeignClientProxyBeanRegistry implements BeanDefinitionRegistryPostProcessor ,ApplicationContextAware,EnvironmentAware {
  3. private static final Logger logger =
  4. LoggerFactory.getLogger(NettyFeignClientProxyBeanRegistry.class);
  5. private Environment environment;
  6. private ApplicationContext applicationContext;
  7. @Override
  8. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
  9. throws BeansException {
  10. //定义NettyFeignClient扫描器
  11. NettyFeignClientBeanDefinitionScanner scanner =
  12. new NettyFeignClientBeanDefinitionScanner(beanDefinitionRegistry,
  13. false,applicationContext);
  14. //scanner.setResourceLoader(resourceLoader);
  15. //scanner.registerFilters();
  16. scanner.scan(environment.getProperty("my.netty.feign.pack"));//com.tianlong
  17. }
  18. @Override
  19. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
  20. throws BeansException {
  21. }
  22. @Override
  23. public void setApplicationContext(ApplicationContext applicationContext)
  24. throws BeansException {
  25. this.applicationContext = applicationContext;
  26. }
  27. @Override
  28. public void setEnvironment(Environment environment) {
  29. this.environment = environment;
  30. }
  31. }