dubbo?filter中有關(guān)bean注入和配置文件讀取方式
dubbo filter中有關(guān)bean注入和配置文件讀取
在寫dubbo的filter時候,需要注入bean和讀取配置文件,然后理所當(dāng)然的就像springboot其他地方的寫法一樣,直接用了@Resource和@Value注解。
但是本地調(diào)試的時候,發(fā)現(xiàn)報錯,注入的bean和讀取的配置變量全部為null,很是不解,于是就上網(wǎng)查了以下資料。
首先,dubbo的攔截器這些組件是由dubbo自己管理的,并不是直接由spring管理的,因此spring的那些注入注解在dubbo里統(tǒng)統(tǒng)不能用。
如果想用可以采取以下代碼:
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調(diào)起,然后在ApplicationContext中去查找對應(yīng)的bean。
而且在查找的過程中是優(yōu)先按照名字去匹配,然后才是type,所以盡量把setter方法名字寫成要注入的bean的名字。
能夠注入Bean的Filter
DelegatingFilterProxy就是一個對于servlet filter的代理,用這個類的好處主要是通過Spring容器來管理servlet filter的生命周期,還有就是如果filter中需要一些Spring容器的實例,可以通過spring直接注入,另外讀取一些配置文件這些便利的操作都可以通過Spring來配置實現(xiàn)。
DelegatingFilterProxy運用
需求:
在springboot中 使用了filter, 并且注入了業(yè)務(wù)工具類(APIUtil ),但注入是null
所以問題就來了:springboot中使用filter時注入bean為null的解決辦法
其實Spring中,web應(yīng)用啟動的順序是: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類,用來手工創(chuàng)建filter的bean, 例如:
@Configuration public class WebConfig { @Bean public Filter tokenAuthFilter() { return new TokenAuthFilter(); //第一步:先將filter放入容器 } /** * 注冊filter,統(tǒng)一處理api開頭的請求 * @return FilterRegistrationBean */ @Bean public FilterRegistrationBean tokenAuthFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); // 第二步:DelegatingFilterProxy把servlet 容器中的filter同spring容器中的bean關(guān)聯(lián)起來 registration.setFilter(new DelegatingFilterProxy("tokenAuthFilter")); registration.addUrlPatterns("/api/*"); registration.setName("tokenAuthFilter"); registration.setOrder(1); return registration; } }
解決辦法2
過濾器是servlet規(guī)范中定義的,并不歸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); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
通過Feign進行調(diào)用@FeignClient?找不到的解決方案
這篇文章主要介紹了通過Feign進行調(diào)用@FeignClient?找不到的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot實現(xiàn)前后端分離國際化的示例詳解
Springboot國際化可以幫助使用者在不同語言環(huán)境中構(gòu)建應(yīng)用程序,這樣應(yīng)用程序可以有效地適應(yīng)不同語言文化背景下的用戶需求。本文主要介紹了SpringBoot實現(xiàn)前后端分離國際化的方法,需要的可以參考一下2023-02-02Java Web文件上傳與下載優(yōu)化的實現(xiàn)方案
文件上傳與下載是 Web 應(yīng)用中常見的功能,尤其是在需要處理大量文件傳輸、存儲的場景下,傳統(tǒng)的文件上傳和下載方式雖然簡單,但如果不加以優(yōu)化,可能會帶來一些問題,所以今天,我們將深入探討 Java Web 中如何實現(xiàn)高效的文件上傳和下載,需要的朋友可以參考下2025-02-02SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實例
這篇文章主要介紹了SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06