前言
Hessian
是一個binary-rpc
協議輕量級RPC呼叫框架,相對於我們常見的Dubbo
,Spring Cloud
使用起來方便簡潔。
基於Spring IOC
實現Hessian
註解形式服務釋出與服務消費。從實現過程深入瞭解Spring 依賴注入的原理。
Hessian 使用
HessianServiceProxyExporter
public class HessianServiceProxyExporter extends HessianServiceExporter {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//此處可做統一資料驗籤
log.info("HessianServiceProxyExporter get request at {}" , LocalDateTime.now());
super.handleRequest(request ,response);
}
}
複製程式碼
hessian 服務暴露
@Bean(name = "/userService")
public HessianServiceExporter initHessian(){
HessianServiceExporter exporter = new HessianServiceProxyExporter();
exporter.setService(new UserServiceImpl());
exporter.setServiceInterface(IUserService.class);
return exporter;
}
複製程式碼
hessian 服務消費
@Bean
public HessianReferenceProxyFactoryBean helloClient() {
HessianReferenceProxyFactoryBean factory = new HessianReferenceProxyFactoryBean();
factory.setServiceUrl("http://127.0.0.1:8080/userService");
factory.setServiceInterface(IUserService.class);
return factory;
}
複製程式碼
將hessian 服務初始化到Spring IOC容器中後與普通Service使用一樣。
@Autowired
private IUserService userService;
複製程式碼
我們從上述的使用Hessian的服務開發過程中會發現每一個Hessian服務的開發都會有一一對應的服務暴露,服務引用。當系統比較龐大的時候就會增加服務管理的難度與大量的重複程式碼
Hessian 註解實現
隨著Spring Boot普及,越來越多人習慣於註解開發模式。Hessian 也可以實現註解模式的開發與使用。
@HessianService
我們先來分析下Hessian服務暴露的過程:
- 例項化一個Service Bean
- 例項化一個HessianServiceExporter bean
- 將HessianServiceExporter 註冊到IOC容器中進行統一管理
這樣我們就可以定義一個組合註解
@HessianService
Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface HessianService {
/**
* hessian服務名稱
* @return
*/
String name() default "";
}
複製程式碼
Service Bean的例項交由Spring IOC來處理
通過實現InitializingBean
, ApplicationContextAware
相應的介面處理@HessianService
服務暴露
@HessianReference
consumer 消費服務,借鑑@Autowired
實現思路:繼承InstantiationAwareBeanPostProcessorAdapter
過載postProcessPropertyValues
方法
InstantiationAwareBeanPostProcessorAdapter
Bean例項化後但在設值顯示屬性之前回撥(實現額外injection策略)postProcessPropertyValues
實現依賴注入
以上便實現了Hessian的註解模式
@HessianService
public class StudentServiceImpl implements IStudentService{
}
複製程式碼
@HessianReference
private IUserService userService;
複製程式碼
小結
上述實現過程中,我們可明顯看出:基於Spring framework
的開發中 一切的Bean操作都圍繞IOC
容器進行;並體現了Spring framework
一個很重要的核心思想面向擴充套件開放
,Spring framework
提供了多種可供擴充套件的介面,通過實現介面中的方法可實現個性化業務(如上述中的@ HessianReference
依賴注入)
此篇文章的重點不是實現Hessian
註解模式,而是通過Hessian
註解模式的實現過程學習Spring
良好的設計分層(面向擴充套件開放):通過分層的設計使得我們的程式碼具高可擴充套件性