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
-> ServiceConfigBeanbasicService
-> BasicServiceInterfaceConfig
标签定义在motan-core
的resources\META-INF\motan.xsd
文件里,spring.schemas
定义标签位置,spring.handlers
文件定义了自定义标签及对应解析器处理类为MotanNamespaceHandler
,自定义解析器为MotanBeanDefinitionParser
AnnotationBean
实现了BeanFactoryPostProcessor
、BeanPostProcessor
、Ordered
三个接口。
BeanFactoryPostProcessor
在容器实例化任何Bean之前读取Bean的定义(配置元数据),并可以修改它。
ClassPathBeanDefinitionScanner
是一个扫描指定类路径中注解Bean定义的扫描器,在它初始化的时候,会初始化一些需要被扫描的注解。AnnotationBean
将MotanService
注解注册到了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