建第一個註解java
package com.tmser.annotation;spring
/**ide
* *@interface用來聲明一個註解,其中的每個方法其實是聲明瞭一個配置參數。 *方法的名稱就是參數的名稱,返回值類型就是參數的類型。 *能夠經過default來聲明參數的默認值。 *在這裏能夠看到@Retention和@Target這樣的元註解,用來聲明註解自己的行爲。 *@Retention用來聲明註解的保留策略,有CLASS、RUNTIME和SOURCE這三種, *分別表示註解保存在類文件、JVM運行時刻和源代碼中。 *只有當聲明爲RUNTIME的時候,纔可以在運行時刻經過反射API來獲取到註解的信息。 *@Target用來聲明註解能夠被添加在哪些類型的元素上,如類型、方法和域等。 *就能夠定義一個註解了,它將自動繼承Annotation */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
//這裏定義了一個空的註解,它能幹什麼呢。我也不知道,但他能用。 }
類,方法,字段使用annotation,能夠經過反射獲取。post
Class getAnnotation(Class<T> annotationClass)
code
Method getAnnotation(Class<T> annotationClass)
blog
Filed getAnnotation(Class<T> annotationClass)
繼承
在spring中能夠結合BeanPostProcessor 實現,在 postProcessBeforeInitialization 處理每一個bean的類,方法,字段的annotation。get
BeanPostProcessor簡介:it
Spring BeanPostProcesssor一般被稱爲Spring Bean回調處理器,它通常用於在實例化一個bean的先後增長一些附加操做,它會對全局的Spring bean配置生效。io
示例代碼:
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//TODO 過濾一些不須要檢查的bean
Class<?> beanClass = AopUtils.getTargetClass(bean);
Field[] beanFields = beanClass.getDeclaredFields();
for (Field beanField : beanFields) {
if (!beanField.isAnnotationPresent(TestAnnotation.class)) {
continue;
}
TestAnnotation testAnnotation = beanField.getAnnotation(LOSClient.class);
//TODO 處理annotation
ReflectionUtils.makeAccessible(beanField);
try {
//設置屬性
beanField.set(bean, getBeanFieldInstance(beanField));
}
catch (Exception exception) {
//TODO
}
}
return bean;
}
參考:http://www.tmser.com/?post=34&page=4