1、jdk1.5内置了三种标准注解
@Override,表示当前的方法定义将覆盖超类中的方法。 @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。 @SuppressWarnings,关闭不当编辑器警告信息。
2、还提供了4种专门负责新注解的创建:
@Target:
@Target –注解用于什么地方,默认值为任何元素,表示该注解用于什么地方。可用的ElementType指定参数
● ElementType.CONSTRUCTOR:用于描述构造器
● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
● ElementType.LOCAL_VARIABLE:用于描述局部变量
● ElementType.METHOD:用于描述方法
● ElementType.PACKAGE:用于描述包
● ElementType.PARAMETER:用于描述参数
● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention
表示需要在什么级别保存该注解信息。
什么时候使用该注解,即注解的生命周期,使用RetentionPolicy来指定
● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们 不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
● RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
● RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
@Document
将注解包含在Javadoc中
@Inherited
允许子类继承父类中的注解
1.定义
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented() public @interface MyAnnotation { String name() default ""; //如果变量为value,后面使用是可以不指定value }
2.使用
@MyAnnotation(name="CC") // @MyAnnotation("cc")
public @interface MyAnnotation { String name() default ""; }
3.现在就可以对注解的类进行操作,有2中方式
第一种.
实现BeanFactoryPostProcessor接口---> 可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,
@Component
public class HessianInterfaceConfig implements BeanFactoryPostProcessor{
private final Log log = LogFactory.getLog(getClass());
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
HashMap<String, String> interfaceMap = new HashMap<>();
String[] beanNames = beanFactory.getBeanNamesForAnnotation(MyAnnotation.class);
....可以进行一系列处理,例如:动态暴露接口等
}
}