先说结论:在dubbo的拦截器中,使用@Autowired自动注入是无效的
你写的bug应该是这样的:
public class ConsumerFilter implements Filter{
@Autowired
private FilterProperties filterProperties;
……
}
解决方法1:
使用set方法注入,这种方式目前在一定条件下可以获取到目标Bean,dubbo在通过SPI加载Filter时,会通过SpringExtensionFactory在spring的ApplicationContext中查找通过set方法注入的Bean,因此只要持有ApplicationContext并且ApplicationContext中有目标Bean,就可以通过该方式获取到。
前提条件:dubbo 服务是通过注解的方式暴露和引用,即保证SpringExtensionFactory能提前有ApplicationContext
private FilterProperties filterProperties;public void setFilterProperties(FilterProperties filterProperties) {
this.filterProperties = filterProperties;
}
解决方法2:
private static ApplicationContext context;
FilterProperties filterProperties = context.getBean(FilterProperties.class);
解决方法3:
@ConfiguationProperties
@Data
public class FilterProperties {
private static FilterProperties instance;@PostConstruct
public void init() {
instance = this; }public static FilterProperties getInstance() {
return instance == null ? new FilterProperties() : instance;
}private boolean apple = false;}
FilterProperties.getInstance().isApple();