Java注解

注解

注解(Annotation)是一种用于为程序代码添加元数据的特殊语法结构。它可以在不改变原有逻辑的情况下,为程序中的类、方法、字段等元素附加额外的信息和标记。

元注解

元注解的作用就是负责注解其他注解。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

元注解有六个:

@Target(表示该注解可以用于什么地方)

ElementType.TYPE:可以作用在类上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成员变量上

@Retention(表示再什么级别保存该注解信息)

SOURCE < CLASS < RUNTIME
SOURCE:表示当前注解只在代码阶段有效
CLASS:表示该注解会被保留到字节码阶段
RUNTIME:表示该注解会被保留到运行阶段 JVM
自定义的注解:RetentionPolicy.RUNTIME

@Documented(将此注解包含再javadoc中)

@Inherited(允许子类继承父类中的注解)

@Repeatable(1.8新增,允许一个注解在一个元素上使用多次)

@Native(1.8新增,修饰成员变量,表示这个变量可以被本地代码引用,常常被代码生成工具使用)

自定义注解

1.定义一个注解

@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE})  //可以在字段、枚举的常量、方法
@Retention(RetentionPolicy.RUNTIME)
public @interface Init {
     String value() default "";
}

2.使用注解

public class User {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    @Init("louis")
    public User setName(String name) {
        this.name = name;
        return this;
    }

    public String getAge() {
        return age;
    }

    @Init("22")
    public User setAge(String age) {
        this.age = age;
        return this;
    }
}

3.注解解析器

public class userFactory {

        public static User create() {
            User user = new User();


            // 获取User类中所有的方法(getDeclaredMethods也行)
            Method[] methods = User.class.getMethods();


            try
            {
                for (Method method : methods)
                {
                    // 如果一个注解指定注解类型是存在于此元素上此方法返回true,否则返回false
                    //参数 -- 对应于注解类型的Class对象
                    if (method.isAnnotationPresent(Init.class))
                    {
                        //此方法返回该元素的注解在此元素的指定注释类型(如果存在),否则返回null
                        Init init = method.getAnnotation(Init.class);
                        // 如果Method代表了一个方法 那么调用它的invoke就相当于执行了它代表的这个方法,在这里就是给set方法赋值
                        method.invoke(user, init.value());
                    }
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;
            }


            return user;
}
}

4.使用

   public static void main(String[] args) {
        User user = userFactory.create();
        user.setAge("30");
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }

Java常用注解

@Override 表示当前方法覆盖了父类的方法

@Deprecated 表示方法已经过时,方法上有横线,使用时会有警告。

@SuppressWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)

@SafeVarargs (jdk1.7更新) 表示:专门为抑制“堆污染”警告提供的。

@FunctionalInterface (jdk1.8更新) 表示:用来指定某个接口必须是函数式接口,否则就会编译出错。

spring常用注解

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@Scope注解 作用域

@Lazy(true) 表示延迟初始化

@Service用于标注业务层组件

@Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope用于指定scope作用域的(用在类上)

@PostConstruct用于指定初始化方法(用在方法上)

@PreDestory用于指定销毁方法(用在方法上)

@DependsOn:定义Bean初始化及销毁时的顺序

@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@PostConstruct 初始化注解

@PreDestroy 摧毁注解 默认 单例 启动就加载

应用场景

  1. 配置管理:很多框架使用注解来进行配置管理,通过在类或方法上添加特定的注解,来指定框架的行为和配置信息。例如,Spring框架使用@Component、@Service、@Autowired等注解来标识组件、依赖注入等配置。
  2. 路由和映射:Web框架(如Spring MVC)使用注解来定义URL路由和请求映射关系。通过在控制器方法上添加@RequestMapping注解,可以指定处理特定URL请求的方法。
  3. 数据验证和校验:许多框架使用注解来进行数据验证和校验。例如,Hibernate Validator框架使用注解(如@NotNull、@Size等)来定义实体类属性的验证规则,方便进行数据校验。
  4. AOP(面向切面编程):AOP框架(如AspectJ)使用注解来定义切点和通知。通过在方法上添加特定的注解,可以指定在什么时候执行哪些切面逻辑。
  5. 缓存管理:一些缓存框架(如Spring Cache)使用注解来标识需要进行缓存操作的方法。通过在方法上添加@Cacheable、@CacheEvict等注解,可以自动缓存和清除缓存。
  6. 事件驱动编程:一些事件驱动框架(如Spring Event)使用注解来标识和处理事件。通过在方法上添加@EventListener注解,可以指定方法作为事件监听器。
  7. 测试框架:测试框架(如JUnit)使用注解来标识测试方法和测试类。通过在方法上添加@Test、@Before、@After等注解,可以指定测试用例的执行顺序和行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值