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
该schema只定义了一个元素 即annotion 这个元素有两个属性id,package。package属性标识了需要扫描的annotion在哪个路径下。
applicationContext.xml
2.实现namespaceHandler接口
spring对于非默认空间下标签的解析处理都是有对应的XXXNamespaceHandler的,比如解析标签,其有一个对应的叫做AopNamespaceHandler的Handler存在,所有在aop命名空间之下的几点的解析交给该Handler处理;但我们在使用时不需要实现namespaceHandler,而可以实现spring为我们提供的NamespaceHandlerSupport,这里面封装了大量的逻辑使我们开发变得简单。
3实现BeanDefinitionParser接口
Spring在解析到annotation标签时会调用AnnotationBeanDefinitionParser的parse方法解析。
parse方法比较简单,只把applicationContext文件内配置的annotation配置的package属性读取出来,并将该属性封装到BeanDefinition内。然后将该BeanDefinition注册到容器。这在里面我们是将AnnotaionBean注册到容器中。Spring容器会实例化AnnotationBean
AnnotationBean的实现
AnnotationBean实现了BeanFactoryPostProcessor,BeanPostProcessor和ApplicationContextAware接口。这三个接口的作用我想大家应该都清楚吧,就不过多叙述。
在postProcessBeanFactory方法中,根据annotation的package属性来扫描Service注解。具体代码如上图。
然后在postProcessAfterInitialization方法中获取Service注解,并获取Service注解标记的类。具体代码如图。
ServiceBean的实现
ServiceBean的实现比较简单,只是将获取到Service注解的content属性输出和Service标记类show方法的调用。
4.spring.handlers和spring.schemas
如何写这两个文件,Spring官方文档写的很清楚。这里就不再展示。具体看github。
测试结果
- Spring自定义annotation实现
- Spring aop +自定义annotation
- Spring自定义Annotation扫描
- 正确实现用spring扫描自定义的annotation
- 基于Spring的AOP实现自定义annotation操作日志
- 正确实现用spring扫描自定义的annotation
- 正确实现用spring扫描自定义的annotation
- 基于Spring的AOP实现自定义annotation操作日志
- Spring AOP的annotation实现
- Spring annotation 实现AOP逻辑
- spring定时器用Annotation实现
- spring定时器用Annotation实现
- annotation方式实现spring aop
- 【Annotation】使用自定义注解实现依赖注入
- JAVA Annotation & 自定义Annotation
- Annotation-自定义Annotation
- Annotation--自定义Annotation
- Spring的AOP的annotation实现
- 树、森林与二叉树的转换
- 树:哈夫曼树(最优二叉树)
- 【笔记】linux系统环境限制修改
- 创建单向链表
- 关于POI文件导出 核心 初始化代码
- Spring自定义annotation实现
- 欢迎使用CSDN-markdown编辑器
- Django反向解析系列之十三
- 添加一行NewRow
- iOS 获取设备唯一标示符的方法
- 类的继承 Java
- Vue2官网简要笔记
- 机器学习之numpy和matplotlib学习(十二)
- 免费测试自己的肤质情况,会有专业的人士指导你!