zoukankan      html  css  js  c++  java
  • Java中的注解原来是这么用的

     先看一个普通的例子

    package util;
      
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
      
    public class DBUtil {
        static String ip = "127.0.0.1";
        static int port = 3306;
        static String database = "test";
        static String encoding = "UTF-8";
        static String loginName = "root";
        static String password = "admin";
        static{
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
      
        public static Connection getConnection() throws SQLException {
            String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
            return DriverManager.getConnection(url, loginName, password);
        }
        public static void main(String[] args) throws SQLException {
            System.out.println(getConnection());
        }
    }

    自定义注解@JDBCConfig

    接下来,就要把DBUtil这个类改造成为支持自定义注解的方式。 首先创建一个注解JDBCConfig

    1. 创建注解类型的时候即不使用class也不使用interface,而是使用@interface

     
    public @interface JDBCConfig
     


    2. 元注解
    @Target({METHOD,TYPE}) 表示这个注解可以用用在类/接口上,还可以用在方法上
    @Retention(RetentionPolicy.RUNTIME) 表示这是一个运行时注解,即运行起来之后,才获取注解中的相关信息,而不像基本注解如@Override 那种不用运行,在编译时eclipse就可以进行相关工作的编译时注解。
    @Inherited 表示这个注解可以被子类继承
    @Documented 表示当执行javadoc的时候,本注解会生成相关文档

    3. 注解元素,这些注解元素就用于存放注解信息,在解析的时候获取出来

     
    String ip();
    int port() default 3306;
    String database();
    String encoding();
    String loginName();
    String password();
    package 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;
    
    @Target({METHOD,TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface JDBCConfig {
         String ip(); 
         int port() default 3306; 
         String database(); 
         String encoding(); 
         String loginName(); 
         String password(); 
    }

    注解方式DBUtil

    有了自定义注解@JDBCConfig之后,我们就把非注解方式DBUtil改造成为注解方式DBUtil。
    如例所示,数据库相关配置信息本来是以属性的方式存放的,现在改为了以注解的方式,提供这些信息了。

    注: 目前只是以注解的方式提供这些信息,但是还没有解析,接下来进行解析

    package util;
    
    import anno.JDBCConfig;
    
    @JDBCConfig(ip = "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")
    public class DBUtil {
        static {
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    }

    解析注解

    接下来就通过反射,获取这个DBUtil这个类上的注解对象

     JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);

    拿到注解对象之后,通过其方法,获取各个注解元素的值:

     
    String ip = config.ip();
    int port = config.port();
    String database = config.database();
    String encoding = config.encoding();
    String loginName = config.loginName();
    String password = config.password();
     


    后续就一样了,根据这些配置信息得到一个数据库连接Connection实例。

    package util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    import anno.JDBCConfig;
    
    @JDBCConfig(ip = "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")
    public class DBUtil {
        static {
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        public static Connection getConnection() throws SQLException, NoSuchMethodException, SecurityException {
            JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);
    
            String ip = config.ip();
            int port = config.port();
            String database = config.database();
            String encoding = config.encoding();
            String loginName = config.loginName();
            String password = config.password();
    
            String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
            return DriverManager.getConnection(url, loginName, password);
        }
        
        public static void main(String[] args) throws NoSuchMethodException, SecurityException, SQLException {
            Connection c = getConnection();
            System.out.println(c);
        }
    }

    注解的分类

    根据注解的作用域@Retention,注解分为
    RetentionPolicy.SOURCE: Java源文件上的注解
    RetentionPolicy.CLASS: Class类文件上的注解
    RetentionPolicy.RUNTIME: 运行时的注解

    按照注解的来源,也是分为3类
    1. 内置注解 如@Override ,@Deprecated 等等
    2. 第三方注解,如Hibernate, Struts等等
    3. 自定义注解,如仿hibernate的自定义注解

    在工作中,大部分都是使用第三方注解, 当然第三方注解本身就是自定义注解。 本教程的主要作用是帮助大家理解这些第三方注解是如何工作的,让大家用得心里踏实一些。

    推荐一个极好的教程:https://how2j.cn/k/annotation/annotation-brief/1055.html?p=49538

    另一个例子:https://www.jianshu.com/p/f85e5212be55

  • 相关阅读:
    how to use epoll with python
    tornado ioloop current和instance的一些区别
    网络标准及路由器速度
    C语言接口

    Dalvik 与 ART
    Android学习笔记47-使用HttpClient接口实现网络通信
    Android学习笔记46-使用Post方式提交数据
    Android学习笔记45-JSON数据解析(GSON方式)
    Android学习笔记44-JSON数据解析
  • 原文地址:https://www.cnblogs.com/volvane/p/9506129.html
Copyright © 2011-2022 走看看