Spring自定义annotation实现

来源:互联网 发布:linux挂载共享文件夹 编辑:程序博客网 时间:2024/05/30 04:17

      在实习的时候使用了dubbo。第一次使用了Spring的自定义annotation,当时就觉得这玩意真好用,一定要学会它。经过几天的探索,终于搞清楚了。

      扩展xml自定义标签需要如下几个步骤(自定义xml标签是自定义annotation标签的基础)

  • 编写xml schema描述自定义元素
  • 实现namespaceHandler接口
  • 实现BeanDefinitionParser接口
  • 编写spring.handlers和spring.schemas(这俩文件必须放到META-INF文件夹下)

    Spring官方文档有具体的例子,不在累述。链接:Spring 官方文档

废话不多说,直接上例子

整个项目的目录结构
项目目录结构

1.编写xml schema

xml schema
该schema只定义了一个元素 即annotion 这个元素有两个属性id,package。package属性标识了需要扫描的annotion在哪个路径下。

applicationContext.xml
applicationContext.xml

2.实现namespaceHandler接口
      spring对于非默认空间下标签的解析处理都是有对应的XXXNamespaceHandler的,比如解析标签,其有一个对应的叫做AopNamespaceHandler的Handler存在,所有在aop命名空间之下的几点的解析交给该Handler处理;但我们在使用时不需要实现namespaceHandler,而可以实现spring为我们提供的NamespaceHandlerSupport,这里面封装了大量的逻辑使我们开发变得简单。
namespaceHandler

3实现BeanDefinitionParser接口
Spring在解析到annotation标签时会调用AnnotationBeanDefinitionParser的parse方法解析。
BeanDefinitionParser
parse方法比较简单,只把applicationContext文件内配置的annotation配置的package属性读取出来,并将该属性封装到BeanDefinition内。然后将该BeanDefinition注册到容器。这在里面我们是将AnnotaionBean注册到容器中。Spring容器会实例化AnnotationBean

AnnotationBean的实现
AnnotationBean
AnnotationBean实现了BeanFactoryPostProcessor,BeanPostProcessor和ApplicationContextAware接口。这三个接口的作用我想大家应该都清楚吧,就不过多叙述。
在postProcessBeanFactory方法中,根据annotation的package属性来扫描Service注解。具体代码如上图。

然后在postProcessAfterInitialization方法中获取Service注解,并获取Service注解标记的类。具体代码如图。
postProcessAfterInitialization

ServiceBean的实现
ServiceBean

ServiceBean的实现比较简单,只是将获取到Service注解的content属性输出和Service标记类show方法的调用。
test

4.spring.handlers和spring.schemas
如何写这两个文件,Spring官方文档写的很清楚。这里就不再展示。具体看github。

测试结果
result