從Hessian RPC 註解方式看Spring依賴注入

柴碼發表於2019-05-03

從Hessian RPC 註解方式看Spring依賴注入

前言

Hessian 是一個binary-rpc協議輕量級RPC呼叫框架,相對於我們常見的DubboSpring 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服務暴露

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

@HessianReference

consumer 消費服務,借鑑@Autowired實現思路:繼承InstantiationAwareBeanPostProcessorAdapter 過載postProcessPropertyValues方法

  • InstantiationAwareBeanPostProcessorAdapter Bean例項化後但在設值顯示屬性之前回撥(實現額外injection策略)
  • postProcessPropertyValues 實現依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

從Hessian RPC 註解方式看Spring依賴注入

以上便實現了Hessian的註解模式

@HessianService
public class StudentServiceImpl  implements IStudentService{
}
複製程式碼
@HessianReference
private IUserService userService;
複製程式碼

小結

上述實現過程中,我們可明顯看出:基於Spring framework的開發中 一切的Bean操作都圍繞IOC容器進行;並體現了Spring framework一個很重要的核心思想面向擴充套件開放 ,Spring framework 提供了多種可供擴充套件的介面,通過實現介面中的方法可實現個性化業務(如上述中的@ HessianReference依賴注入)

此篇文章的重點不是實現Hessian註解模式,而是通過Hessian註解模式的實現過程學習Spring良好的設計分層(面向擴充套件開放):通過分層的設計使得我們的程式碼具高可擴充套件性

原始碼在這裡

相關文章