Spring自定义注解学习

本文介绍如何在Spring框架中自定义注解,并通过示例演示如何将自定义注解应用于类、方法等不同场景,同时展示了如何读取注解信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring中有很多的注解使我们开发过程更加简洁方便。
这些注解的本质也是一个一个的java类与接口的实现。
他们具体是怎么实现的呢,在前几天学习的时候,我无意间看到了一个类的泛型叫做@interface,很有意思,学习之后发现他原来就是用来定义注解类的。
使用了@interface泛型就会被框架默认为继承了Annotation接口。
之后我们就可以自定义一个注解类来实现一些好玩的东西了,比如初始化赋值,或者在注解解析器里进行一些数据校验等等。
这样做比每个类都要继承父类或者实现接口要方便一些。
还可以应用到aop切面中,进行一些日志的管理等等。

话不多说,放码过来:

第一步,把冰箱门··咳咳···自定义一个注解类;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//注解包含在javadoc中:
@Documented
//注解可以被继承
@Inherited
//目标:
//ElementType.ANNOTATION_TYPE:可以给注解进行注解
//ElementType.CONSTRUCTOR:可以给构造方法进行注解
//ElementType.FIELD:可以给字段进行注解
//ElementType.LOCAL_VARIABLE:可以给局部变量进行注解
//ElementType.METHOD:可以给方法进行注解
//ElementType.PACKAGE:可以给包进行注解
//ElementType.PARAMETER:可以给方法内的参数进行注解
//ElementType.TYPE:可以给类型进行注解,比如类、接口和枚举
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public  @interface Something {

	//使用@interface声明自己是个注解类,自定义一个注解
	public String xx() default "666";

}

第二步:把大象···

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Todo {
	
	
	@Something(xx = "33")
	//如果一个@Something中只有一个属性名字叫value,那么可以@Something("33")的格式赋值
	public static String data;
	
//	
//	public static String getData() {
//		return data;
//	}
//	
//	public static void setData(String data) {
//		test3.data = data;
//	}

	public static void main(String[] args) {
		create();
		System.out.println(data);
	}
	    
	
	 public static Todo create(){
		 Todo user = new Todo();
	        // 获取Something类中所有的方法(getDeclaredMethods也行)
	      //  Method[] methods = Todo.class.getMethods();
	        Field[] fields = Todo.class.getFields();
	        try{
	        	//获取应用到使用类的方法上的注解
//	            for (Method method : methods){
//	                // 如果此方法有注解,就把注解里面的数据赋值到user对象
//	                if (method.isAnnotationPresent(Something.class)){
//	                	Something Something = method.getAnnotation(Something.class);
//	                    method.invoke(user, Something.xx());
//	                }
//	            }
	        	//获取应用到使用类的属性上的注解
	            for (Field field : fields) {
	                if (field.isAnnotationPresent(Something.class)){
	                	Something Something = field.getAnnotation(Something.class);
	                	field.set(user, Something.xx());
	                }
				}
	        }catch (Exception e){
	            e.printStackTrace();
	            return null;
	        }
	        return user;
	    }
}

@Something(xx="33")的输出结果是33;

@Something的输出结果是666;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值