dubbo filter中有关bean注入和配置文件读取方式

 更新时间:2024年05月16日 08:43:54   作者:weixin_45614626  
这篇文章主要介绍了dubbo filter中有关bean注入和配置文件读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

dubbo filter中有关bean注入和配置文件读取

在写dubbo的filter时候,需要注入bean和读取配置文件,然后理所当然的就像springboot其他地方的写法一样,直接用了@Resource和@Value注解。

但是本地调试的时候,发现报错,注入的bean和读取的配置变量全部为null,很是不解,于是就上网查了以下资料。

首先,dubbo的拦截器这些组件是由dubbo自己管理的,并不是直接由spring管理的,因此spring的那些注入注解在dubbo里统统不能用。

如果想用可以采取以下代码:

	private Environment environment;

    public void setEnvironment(Environment environment){
        this.environment=environment;
    }
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String headerTopic = environment.getProperty("spring.kafka.header-topic");
        Result result = invoker.invoke(invocation);
        return result;
    }

这样就可以读取到配置文件了。

如果想要注入bean,则使用以下代码:

private KafkaTemplate<String, String> headKafkaTemplate;
public void setHeadKafkaTemplate(KafkaTemplate<String, String> headKafkaTemplate){
        this.headKafkaTemplate = headKafkaTemplate;
    }

dubbo组件实例化后,setter方法会被dubbo调起,然后在ApplicationContext中去查找对应的bean。

而且在查找的过程中是优先按照名字去匹配,然后才是type,所以尽量把setter方法名字写成要注入的bean的名字。

能够注入Bean的Filter

DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。

DelegatingFilterProxy运用

需求:

在springboot中 使用了filter, 并且注入了业务工具类(APIUtil ),但注入是null

所以问题就来了:springboot中使用filter时注入bean为null的解决办法

其实Spring中,web应用启动的顺序是:listener->filter->servlet,先初始化listener,然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化

解决办法1

public class TokenAuthFilter implements Filter {
 
    private final static Logger log = LoggerFactory.getLogger(TokenAuthFilter.class);
 
    @Autowired
    private APIUtil apiUtil;
}

新增一个config类,用来手工创建filter的bean, 例如:

@Configuration
public class WebConfig {
 
  @Bean
    public Filter tokenAuthFilter() {
 
        return new TokenAuthFilter(); //第一步:先将filter放入容器
    }
    /**
     * 注册filter,统一处理api开头的请求
     * @return FilterRegistrationBean
     */
    @Bean
    public FilterRegistrationBean tokenAuthFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        // 第二步:DelegatingFilterProxy把servlet 容器中的filter同spring容器中的bean关联起来
        registration.setFilter(new DelegatingFilterProxy("tokenAuthFilter"));
        registration.addUrlPatterns("/api/*");
        registration.setName("tokenAuthFilter");
        registration.setOrder(1);
        return registration;
    }
}

解决办法2

过滤器是servlet规范中定义的,并不归spring容器管理,也无法直接注入spring中的bean(会报错)

初始化时通过spring上下文获取,进行bean的初始化:

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
    RedisTemplate demoBean = (RedisTemplate)context.getBean("redisTemplate");
    System.out.println(demoBean);
 }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot 事务实战之如何解决 DB 与 MQ 的"双写不一致"问题

    Spring Boot 事务实战之如何解决 DB 与 MQ 

    本文结合代码案例探讨如何利用Spring的 TransactionSynchronizationManager 实现事务提交后触发(Trigger After Commit)机制,优雅解决数据库与消息队列的"双写一致性"问题,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java 8实现图片BASE64编解码

    Java 8实现图片BASE64编解码

    Java 8终于有了标准的方法来处理base64的编解码。Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现。但是,Java 8实现了BASE64编解码API,它包含到java.util包。下面这篇文章我会对Java 8的BASE64编解码做一个详细的介绍。
    2016-10-10
  • 详解Redis 缓存 + Spring 的集成示例

    详解Redis 缓存 + Spring 的集成示例

    本篇文章主要介绍了Redis 缓存 + Spring 的集成示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java中多线程同步类 CountDownLatch

    Java中多线程同步类 CountDownLatch

    本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • 浅谈Java文件执行顺序、main程序入口的理解

    浅谈Java文件执行顺序、main程序入口的理解

    这篇文章主要介绍了Java文件执行顺序、main程序入口的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • JVM内存与CPU占用过高问题定位及解决

    JVM内存与CPU占用过高问题定位及解决

    文章介绍了一种通过排查思路定位Java程序中CPU和内存占用过高的问题的方法,通过运行一个模拟无限添加byte[]的代码,使用top命令查看进程占用情况,然后通过查看线程列表和输出堆栈信息,最终定位到具体的代码方法
    2026-01-01
  • Java NIO 底层原理解析

    Java NIO 底层原理解析

    Java IO读写通过系统调用在内核与进程缓冲区间传输数据,不直接操作磁盘,本文给大家介绍Java NIO 底层原理解析,感兴趣的朋友一起看看吧
    2025-07-07
  • Java基于正则表达式获取指定HTML标签指定属性值的方法

    Java基于正则表达式获取指定HTML标签指定属性值的方法

    这篇文章主要介绍了Java基于正则表达式获取指定HTML标签指定属性值的方法,涉及java基于正则的HTML元素匹配相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • Java11 中基于嵌套关系的访问控制优化问题

    Java11 中基于嵌套关系的访问控制优化问题

    在 Java 语言中,类和接口可以相互嵌套,这种组合之间可以不受限制的彼此访问,包括访问彼此的构造函数、字段、方法,接下来通过本文给大家介绍Java11中基于嵌套关系的访问控制优化问题,感兴趣的朋友一起看看吧
    2022-01-01
  • Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    这篇文章主要为大家详细介绍了Java语言实现简单FTP软件,FTP连接管理模块的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论