spring自定义注解
spring 自定义注解用处很多,可以用来验证权限,也可以自定义功能
1.常用注解
对于@component 注解,怎么添加到spring 容器中的。
查看Spring的源码会发现,Spring是使用*ClassPathScanningCandidateComponentProvider*扫描package,
这个类通过扫basePackage的 classpath , 会判断被@Component 标注的类加入 inCludeFilter中 被spring扫描到加入容器,
1 | protected void registerDefaultFilters() { |
2.定制注解
(1)还是使用以上的方法,然后再去出来进行处理,比如 spring MVC 的@controller,就是这么实现的。
** 那么Spring MVC是如何获取这些映射关系,并将其注册到handlerMap中呢?**
取出所有bean ,循环查找Controller的bean 取出RequestMapping的信息,并将URL与Controller的映射关系注册到handlerMap中。
(实例:*AbstractDetectingUrlHandlerMapping* 中的 *detectHandlers*方法,这个方法的目的是取得所有可能的Controller,并将URL与Controller的映射关系注册到handlerMap中,默认实现类 DefaultAnnotationHandlerMapping )
(这个方法 取出所有object的bean 然后进行筛选,[基于注解的Spring MVC的URL与Controller映射关系提取的实现分析](http://blog.csdn.net/gavid0124/article/details/45247777),)
1 | protected void detectHandlers() throws BeansException { |
1 | protected String[] determineUrlsForHandler(String beanName) { |
(2)不依赖@component 扫描,自定义扫描,需要用到spring 对外提供的几种接口
ApplicationContextAware接口:spring 读取实现这个接口的类通过setApplicationContext 方法 传入spring的applicationContext
BeanFactoryPostProcessor接口:Spring会在BeanFactory的相关处理完成后调用postProcessBeanFactory方法,进行定制的功能。
3.对于定制的注解 可以使用spring提供的方法进行扫描
1 |
参考文章:
http://www.jianshu.com/p/7c2948f64b1c
http://blog.csdn.net/gavid0124/article/details/45247777
java 注解
1、@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
2、@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
** @Inherited **比如有一个类A,在他上面有一个标记annotation,那么A的子类B是否不用再次标记annotation就可以继承得到呢,答案是肯定的
如
1 | @Target(ElementType.PARAMETER) |
//自定义注解相关设置
@Documented
@Target``({ ElementType.METHOD, ElementType.TYPE })
@Retention``(RetentionPolicy.RUNTIME)
public
@interface
Authority {
``Role[]value() ``default
{ Role.USER };
``//自定义注解的属性,default是设置默认值
``// String desc() default "无描述信息";
}