深入JAVA注解之方法注解
以获取数据库连接为例,建立maven项目
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <groupId>org.guangsoft</groupId> 6 <artifactId>annotation</artifactId> 7 <version>1.0</version> 8 <packaging>war</packaging> 9 <name>annotation</name> 10 <dependencies> 11 <dependency> 12 <groupId>com.mchange</groupId> 13 <artifactId>mchange-commons-java</artifactId> 14 <version>0.2.9</version> 15 </dependency> 16 <dependency> 17 <groupId>com.mchange</groupId> 18 <artifactId>c3p0</artifactId> 19 <version>0.9.5</version> 20 </dependency> 21 <dependency> 22 <groupId>mysql</groupId> 23 <artifactId>mysql-connector-java</artifactId> 24 <version>8.0.11</version> 25 </dependency> 26 </dependencies> 27 </project>
建立注解类
1 package org.guangsoft.annotation.entity; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Target(ElementType.METHOD) 9 @Retention(RetentionPolicy.RUNTIME) 10 public @interface DBInfo { 11 //属性名参考com.mchange.v2.c3p0.DriverManagerDataSource 12 String driverClass() default "com.mysql.jdbc.Driver"; 13 String jdbcUrl() default "jdbc:mysql://192.168.50.30:3306/guanghe"; 14 String user() default "root"; 15 String password() default "root"; 16 }
建立dao层
1 package org.guangsoft.annotation.dao; 2 3 import org.guangsoft.annotation.entity.DBInfo; 4 5 import com.mchange.v2.c3p0.ComboPooledDataSource; 6 7 public class CommDAO { 8 9 private ComboPooledDataSource dataSource; 10 11 @DBInfo 12 public void setDataSource(ComboPooledDataSource dataSource) { 13 this.dataSource = dataSource; 14 } 15 16 public ComboPooledDataSource getDataSource() { 17 return dataSource; 18 } 19 20 }
建立工厂类
1 package org.guangsoft.annotation.utils; 2 3 import java.beans.BeanInfo; 4 import java.beans.Introspector; 5 import java.beans.PropertyDescriptor; 6 import java.lang.reflect.Method; 7 8 import javax.sql.DataSource; 9 10 import org.guangsoft.annotation.dao.CommDAO; 11 import org.guangsoft.annotation.entity.DBInfo; 12 13 public class JDBCUtil2 { 14 15 //将注解注入到数据源类 16 private static DataSource getDataSourceByDBInfo (DBInfo dbInfo, DataSource dataSource) { 17 Method[] methods = DBInfo.class.getMethods(); 18 for(Method method : methods) { 19 String name = method.getName(); 20 try { 21 //注解类没有属性,反射注解类的方法名,内省出数据源类设置参数的方法, 找不到会抛异常,进入下次循环 22 PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, dataSource.getClass()); 23 //注解类的方法能得到实际注解的值 24 Object value = method.invoke(dbInfo, null); 25 //用数据源的方法将注解类的值注入 26 propertyDescriptor.getWriteMethod().invoke(dataSource, value); 27 } catch(Exception e) { 28 continue; 29 } 30 } 31 return dataSource; 32 } 33 34 //工厂模式下的创建DAO 35 public static CommDAO createCommDAO() { 36 CommDAO commDAO = new CommDAO(); 37 try { 38 BeanInfo beanInfo = Introspector.getBeanInfo(commDAO.getClass(), Object.class); 39 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); 40 if(propertyDescriptors != null) { 41 for(PropertyDescriptor propertyDescriptor : propertyDescriptors) { 42 Method setMethod = propertyDescriptor.getWriteMethod(); 43 DBInfo dbInfo = setMethod.getAnnotation(DBInfo.class); 44 if(dbInfo != null) { 45 //获取dao中dataSource的实体类ComboPooledDataSource 46 Class dataSourceClass = propertyDescriptor.getPropertyType(); 47 DataSource dataSource = (DataSource) dataSourceClass.newInstance(); 48 dataSource = getDataSourceByDBInfo(dbInfo, dataSource); 49 setMethod.invoke(commDAO, dataSource); 50 } 51 } 52 } 53 }catch(Exception e) { 54 e.printStackTrace(); 55 } 56 return commDAO; 57 } 58 59 }
建立测试类
1 package org.guangsoft.annotation.service; 2 3 import java.sql.Connection; 4 5 import javax.sql.DataSource; 6 7 import org.guangsoft.annotation.dao.CommDAO; 8 import org.guangsoft.annotation.utils.JDBCUtil2; 9 10 public class CommService { 11 12 public static void main(String args[]) throws Exception { 13 CommDAO commDAO = JDBCUtil2.createCommDAO(); 14 DataSource dataSource = commDAO.getDataSource(); 15 Connection connection = dataSource.getConnection(); 16 System.out.println(connection); 17 } 18 19 }
测试结果:成功
深入JAVA注解之方法注解相关推荐
- generator代码自动生成工具(动态生成注释、类注解、方法注解等)适用于swagger等需要配置实体类的场景
generator代码生成器大家都不陌生,但是在实际的业务场景中,实体类只有属性.getter/setter方法不满足需求,还需要手动去添加需要的功能.比如项目使用swagger生成api文档时,需要 ...
- Java核心知识点之注解简介和最佳实践
Java注解简介 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文档主要特征之一就是:用专 ...
- java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作
我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得 ...
- ARTS打卡计划第二周-Share-使用java注解对方法计时
现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...
- java扫描指定package注解_java随笔-扫描使用指定注解的类与方法
前几天项目中让扫描出所有使用Restful API的方法.刚开始还想着用python过滤关键字来查找的,后来想想可以使用反射来搞的.主要包含以下三个步骤: 根据包名解析包的具体路径 查找指定包下指定注 ...
- java 方法注解_使用Java注解不正确的方法
java 方法注解 几乎没有什么@Deprecated没有适当的文档看到@Deprecated方法更令人生气的了. 我感到失落. 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她 ...
- java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解
反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- java Junit 为什么@Test注解里的方法必须是public void修饰的
通过查阅了Junit的源码,里面有段代码是这样的 1 protected void validateInstanceMethods(List < Throwable > errors) { ...
最新文章
- android 自定义命名空间,Android自定义ActionBar实例
- python xlrd xlwt综合_xlrd和xlwt -- python
- 人工智能与大数据开发的12个注意事项
- 参加Tech.Ed 2006北京行
- 那个成人总会遇到的小问题……
- 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)
- 年薪40W+还招不到人!人工智能到底有多火?(附人工智能+Python 自学视频资料)...
- python 爬虫代码_Python 你见过三行代码的爬虫吗
- django-一对一关系
- nginx解析漏洞 只要可以上传文件就会被黑
- sqlite C#
- Fortran入门教程(八)——子例程及函数
- Fragstats官方入门教程1 配置软件
- Acer4552G双硬盘
- 数字交通灯设计(Multisim仿真+PCB实物)
- python实现图片找不同游戏_用Python实现QQ游戏大家来找茬辅助工具
- 华为防火墙笔记-安全策略
- c语言程序设计 学籍,c语言学籍信息管理系统设计
- FLINK 极客时间
- 云宏Ceph分布式存储高性能设计
热门文章
- Mysql数据库(四)——mysql索引相关知识
- Linux系统查看硬件相关信息
- 25个优秀的Ajax技术和实例
- android 观察者更新ui,android通过观察者模式实现更新UI
- asp.net添加删除表格_你问我答|135编辑器使用之超链接和表格问题
- java文档注释生产api没有注释_一个神奇的没有springboot注释的api文档生成器---JApiDocs...
- 公众号服务器配置url证书问题,公众号服务器配置url,验证token一直出错,为什么?...
- win10千万不要重置_DELL戴尔电脑WIN10升级后没有声音
- php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
- php event loop,理解javascript中的事件循环(Event Loop)