以获取数据库连接为例,建立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注解之方法注解相关推荐

  1. generator代码自动生成工具(动态生成注释、类注解、方法注解等)适用于swagger等需要配置实体类的场景

    generator代码生成器大家都不陌生,但是在实际的业务场景中,实体类只有属性.getter/setter方法不满足需求,还需要手动去添加需要的功能.比如项目使用swagger生成api文档时,需要 ...

  2. Java核心知识点之注解简介和最佳实践

    Java注解简介 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文档主要特征之一就是:用专 ...

  3. java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作

    我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得 ...

  4. ARTS打卡计划第二周-Share-使用java注解对方法计时

    现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...

  5. java扫描指定package注解_java随笔-扫描使用指定注解的类与方法

    前几天项目中让扫描出所有使用Restful API的方法.刚开始还想着用python过滤关键字来查找的,后来想想可以使用反射来搞的.主要包含以下三个步骤: 根据包名解析包的具体路径 查找指定包下指定注 ...

  6. java 方法注解_使用Java注解不正确的方法

    java 方法注解 几乎没有什么@Deprecated没有适当的文档看到@Deprecated方法更令人生气的了. 我感到失落. 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她 ...

  7. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  8. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  9. java Junit 为什么@Test注解里的方法必须是public void修饰的

    通过查阅了Junit的源码,里面有段代码是这样的 1 protected void validateInstanceMethods(List < Throwable > errors) { ...

最新文章

  1. android 自定义命名空间,Android自定义ActionBar实例
  2. python xlrd xlwt综合_xlrd和xlwt -- python
  3. 人工智能与大数据开发的12个注意事项
  4. 参加Tech.Ed 2006北京行
  5. 那个成人总会遇到的小问题……
  6. 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)
  7. 年薪40W+还招不到人!人工智能到底有多火?(附人工智能+Python 自学视频资料)...
  8. python 爬虫代码_Python 你见过三行代码的爬虫吗
  9. django-一对一关系
  10. nginx解析漏洞 只要可以上传文件就会被黑
  11. sqlite C#
  12. Fortran入门教程(八)——子例程及函数
  13. Fragstats官方入门教程1 配置软件
  14. Acer4552G双硬盘
  15. 数字交通灯设计(Multisim仿真+PCB实物)
  16. python实现图片找不同游戏_用Python实现QQ游戏大家来找茬辅助工具
  17. 华为防火墙笔记-安全策略
  18. c语言程序设计 学籍,c语言学籍信息管理系统设计
  19. FLINK 极客时间
  20. 云宏Ceph分布式存储高性能设计

热门文章

  1. Mysql数据库(四)——mysql索引相关知识
  2. Linux系统查看硬件相关信息
  3. 25个优秀的Ajax技术和实例
  4. android 观察者更新ui,android通过观察者模式实现更新UI
  5. asp.net添加删除表格_你问我答|135编辑器使用之超链接和表格问题
  6. java文档注释生产api没有注释_一个神奇的没有springboot注释的api文档生成器---JApiDocs...
  7. 公众号服务器配置url证书问题,公众号服务器配置url,验证token一直出错,为什么?...
  8. win10千万不要重置_DELL戴尔电脑WIN10升级后没有声音
  9. php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
  10. php event loop,理解javascript中的事件循环(Event Loop)