自定義注解的簡單使用


        框架開發時不免會涉及到配置文件,如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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM