自定义注解的简单使用

    框架开发时不免会涉及到配置文件,如properties、xml以及txt等格式的文件。这里介绍框架中通过自定义注解的形式简化配置:


  • 根据需求编写自定义注解中的属性(这里以JDBCConfig为例,这是一个注入数据库常用配置的注解类)

  @Target是java的元注解(即修饰注解的注解),这里的@Target({METHOD,TYPE})指可以修饰方法、描述类、接口(包括注解类型) 或enum声明。

  @Retention是java中的运行时注解,可以划分为三类

      1.RetentionPolicy.RUNTIME:注解不仅会被保存到class文件里,在jvm加载class文件之后仍然不会消失。

    2.RetentionPolicy.CLASS:注解会被保留到class文件里,但jvm加载class文件时被遗弃,默认的生命周期如此。

    3.RetentionPolicy.SOURCE:注解只会保留在源文件中,当java文件变异成class文件shi

   @Inherited:允许子类继承父类的注解

   @Documented:注解表明制作javadoc时,是否将注解信息加入文档。(添加时表示制作javadoc时将注解会加入其中)

package com.ssm.test.anno;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;

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

// jdbc:sqlserver://localhost:1433;DataBaseName=sqlserverdb
/**
 * @Title: JDBCConfig.java
 * @Package ctl.anno
 * @Description: 自定义注解类-->可用于数据库连接
 * @author chentl
 * @date 2017年7月7日14:38:34
 * @version V1.0
 */
@Target({METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {

    String ip();

    int port() default 1433;

    String database();

    String encoding();

    String loginName();

    String password();

    String driverName();
}

  • 接下来直接在数据交互层通过注解的形式注入使用就OK了
  /**
     * @Title: SelectMethod.java
     * @Package com.ctl.test
     * @Description: 获取数据库连接
     * @author chentl
     * @date 2017/6/8 上午11:16:19
     * @version V1.0
     */
    @JDBCConfig(database = "sqlserverdb", driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver", encoding = "UTF-8", ip = "192.168.1.191", loginName = "sa", password = "123")
    public Connection getConnection() {
        Connection conn = null;
        try {
            JDBCConfig jconfg=DBManager.class.getAnnotation(JDBCConfig.class);
            String url = jconfg.ip();
            String user = jconfg.loginName();
            String password = jconfg.password();
            String driver = jconfg.driverName();
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return conn;
    }
}

  • 另外,注解不仅可以用于配置信息的注入,还可以在注解中追加对字段的验证哦~这里举个验证的例子。

    验证注解@NotEmpty源码

package org.hibernate.validator.constraints;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
@NotNull
@Size(min = 1)
public @interface NotEmpty {
    String message() default "{org.hibernate.validator.constraints.NotEmpty.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    /**
     * Defines several {@code @NotEmpty} annotations on the same element.
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        NotEmpty[] value();
    }
}

    使用

   @NotEmpty(message = "密码不能为空", groups = {AccountGroup.Add.class})
    @Size(min = 6, max = 20, message = "密码长度必须在{min}和{max}之间", groups = {AccountGroup.Add.class})
    private String password;
时间: 2024-10-25 14:57:25

自定义注解的简单使用的相关文章

SpringBoot入门十八,自定义注解的简单实现

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加aop支持 <!-- 引入aop切面支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

自定义注解实现简单的orm映射框架

package com.mj; import javax.xml.bind.Element; import java.lang.annotation.*; import java.lang.reflect.Field; public class Test01 { @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface table{ String value(); } @Target(value

自定义注解之运行时注解(RetentionPolicy.RUNTIME)

对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃: 2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期: 3.RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在: 这3个生

使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

这次给大家介绍一下在Java开发过程中 使用自定义注解开发:主要知识点:            1.反射            主要用于提取注解信息            2.自定义异常  主要是为了自己自定义一个异常信息            3.自定义注解  本次重点 学会如何自定义注解以及如何使用反射提取注解信息运用到实际开发下图表示在Java中注解的含义以及注解的分类和如何解析注解 通常我们使用自定义注解一般使用4中元注解即:@Target@Retention@Documented@In

自定义注解判空简单示例

不说废话,上主代码: import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import a.jery.NotNull; public final class Demo { public static void main(Str

java自定义注解以及注解的简单介绍

jdk自带注解 @Override 覆盖父类的方法 @Deprecated  注解一个方法 表示该方法过时了 @Suppvisewarnings     @SupressWarnings("deprecation")//忽略警告 常见第三方注解 Spring: @Autowired   自动生成一个类的实例 @Service @Repository Mybatis: @InsertProvider @UpdateProvider @Options 注解的分类 运行机制化分 源码注解 注

自定义注解框架的那些事

一.前言 距离上次更新已过一个半月,工作太忙也不是停更的理由.我这方面做得很不好,希望大家给予监督.首先会讲解[编译期资源注入],接着是[下拉刷新注入](通过注解来实现下拉刷新功能),最后打造一款[特色的注解框架]. 大家准备好公交卡了吗,开车了 - 二.什么是注解 每位童鞋对 注解 都有自己的理解,字面上的意思就是[额外的加入],在项目当中使用的注解的框架已经越来越多,如 : retrofit ,butterknife,androidannotations - 2017年Android百大框架

深入理解Java:注解(Annotation)自定义注解入门

引用: http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring