加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用自定义注解

发布时间:2020-12-15 07:39:53 所属栏目: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" ; sta

?

?

一个普通的例子

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实例。

注解的分类

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

?

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

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

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读