Motan SpringSupport

2018/08/26

MotanService&MotanReferer

ServiceConfigBean

ServiceConfigBean,实现InitializingBean接口,重写afterPropertiesSet方法,在bean初始化时加载motan配置。同时实现ApplicationListener接口,重写onApplicationEvent方法。在Spring容器初始化完成后发布服务。(Web项目中该方法会被调用两次?)

InitializingBean

Spring初始化bean的两种方式:

  • 实现InitializingBean接口,重写afterPropertiesSet方法
  • 反射原理,配置文件使用init-method标签直接注入bean

接口比配置效率高,但是配置消除了对spring的依赖。两种方式同时使用会先调用afterPropertiesSet方法再调用init-method方法。如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

DisposableBean

Spring容器初始化和销毁bean前所做的操作定义方法有三种:

  • 通过@PostConstruct和@PreDestroy方法实现初始化和销毁bean之前的操作
  • 在xml中定义init-method和destroy-method方法
  • 通过bean实现InitializingBean和DisposableBean

BeanPostProcessor

Spring中的后置处理器,在bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。可以定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IOC容器中。

  • postProcessorBeforeInitailization方法,在Spring容器中bean实例化、依赖注入之后以及自定义初始化方法(例如:init-method属性指定的初始化方法)之前调用。
  • postProcessorAfterInitailization 在bean实例化、依赖注入及自定义初始化方法之后调用

BeanFactoryAware

获取bean的工厂类,setBeanFactory方法参数会提供BeanFactory,通过这个BeanFactory就可以获取bean对象。

ApplicationListener

事件监听,监听容器中发布的事件,事件驱动模型开发。实现ApplicationListener接口,重写onApplicationEvent方法,在Spring容器初始化完成后执行操作。 1)写一个监听器(ApplicationListener实现类)来监听某个事件(ApplicationEvent及其子类); 2)把监听器加入到容器; 3)只要容器中有相关事件的发布,我们就能监听到这个事件; ContextRefreshedEvent:容器刷新完成(所有bean都完全创建)会发布这个事件; ContextClosedEvent:关闭容器会发布这个事件; 4)发布事件:applicationContext.publishEvent();

SpringBoot启动过程和接口调用汇总: https://segmentfault.com/a/1190000006918229

ServiceConfig

ServiceConfigBean,继承了ServiceConfig配置类。ServiceConfig定义motan客户端和服务端的所有配置属性,并实现了服务发布方法。

MotanNamespaceHandler

Spring的自定义标签解析是通过写一个继承自NamespaceHandlerSupport的类,并实现init方法。在init方法中,去注册解析器。然后在解析xml时,通过约定的key去Map中拿到相应的解析器进行解析。

自定义MQ消息解析器: https://blog.csdn.net/boneix/article/details/73608573

  • service -> ServiceConfigBean
  • basicService -> BasicServiceInterfaceConfig

标签定义在motan-coreresources\META-INF\motan.xsd文件里,spring.schemas定义标签位置,spring.handlers文件定义了自定义标签及对应解析器处理类为MotanNamespaceHandler,自定义解析器为MotanBeanDefinitionParser

AnnotationBean

实现了BeanFactoryPostProcessorBeanPostProcessorOrdered三个接口。

BeanFactoryPostProcessor

在容器实例化任何Bean之前读取Bean的定义(配置元数据),并可以修改它。

ClassPathBeanDefinitionScanner

是一个扫描指定类路径中注解Bean定义的扫描器,在它初始化的时候,会初始化一些需要被扫描的注解。AnnotationBeanMotanService注解注册到了Spring中,Spring容器就可以加载并识别自定义注解。

Spring自定义注解加载和使用有两种方式: 1)使用@Component来声明自定义注解 2)使用ClassPathBeanDefinitionScanner扫描器将自定义注解添加到Spring中。

postProcessBeforeInitialization

初始化MotanReferer调用远程服务,referenceConfig.getRef()

postProcessAfterInitialization

初始化MotanService发布远程服务,serviceConfig.export()

单例模式

饿汉式

public class A {
    private static class A() b = new A();
    private A() {

    }
    public static getInstance() {
        return b;
    }
}

Summary

这一模块告诉我们,一个框架要支持Spring的方式和操作。通过自定义标签和注解来支持Spring。

Todo

这一模块还有内容要看,继续AnnotationBean

Post Directory