• 自定义注解的简单使用


            框架开发时不免会涉及到配置文件,如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;
  • 相关阅读:
    一句话解释各种虚拟币的用途
    php 网站301重定向设置代码实战案例
    seo网页加速技术,预加载 DNS Prefetching 详解
    AI赌神称霸德扑的秘密,刚刚被《科学》“曝光”了
    java实现 HTTP/HTTPS请求绕过证书检测代码实现
    pyspider源码解读--调度器scheduler.py
    pyspider操作千万级库,pyspider在对接量级较大库的策略
    尼克《人工智能简史》谈人工智能的历史、现实与未来
    CentOS7使用yum命令安装Java1.8
    php ci nginx 伪静态rewrite配置方法
  • 原文地址:https://www.cnblogs.com/myinspire/p/7308857.html
Copyright © 2020-2023  润新知