自定义注解的简单使用

时间:2022-05-21 12:00:55

        框架开发时不免会涉及到配置文件,如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;