以获取数据库连接为例,建立maven项目

 <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.guangsoft</groupId>
<artifactId>annotation</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>annotation</name>
<dependencies>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>
</project>

建立注解类

 package org.guangsoft.annotation.entity;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBInfo {
//属性名参考com.mchange.v2.c3p0.DriverManagerDataSource
String driverClass() default "com.mysql.jdbc.Driver";
String jdbcUrl() default "jdbc:mysql://192.168.50.30:3306/guanghe";
String user() default "root";
String password() default "root";
}

建立dao层

 package org.guangsoft.annotation.dao;

 import org.guangsoft.annotation.entity.DBInfo;

 import com.mchange.v2.c3p0.ComboPooledDataSource;

 public class CommDAO {

     private ComboPooledDataSource dataSource;

     @DBInfo
public void setDataSource(ComboPooledDataSource dataSource) {
this.dataSource = dataSource;
} public ComboPooledDataSource getDataSource() {
return dataSource;
} }

建立工厂类

 package org.guangsoft.annotation.utils;

 import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method; import javax.sql.DataSource; import org.guangsoft.annotation.dao.CommDAO;
import org.guangsoft.annotation.entity.DBInfo; public class JDBCUtil2 { //将注解注入到数据源类
private static DataSource getDataSourceByDBInfo (DBInfo dbInfo, DataSource dataSource) {
Method[] methods = DBInfo.class.getMethods();
for(Method method : methods) {
String name = method.getName();
try {
//注解类没有属性,反射注解类的方法名,内省出数据源类设置参数的方法, 找不到会抛异常,进入下次循环
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, dataSource.getClass());
//注解类的方法能得到实际注解的值
Object value = method.invoke(dbInfo, null);
//用数据源的方法将注解类的值注入
propertyDescriptor.getWriteMethod().invoke(dataSource, value);
} catch(Exception e) {
continue;
}
}
return dataSource;
} //工厂模式下的创建DAO
public static CommDAO createCommDAO() {
CommDAO commDAO = new CommDAO();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(commDAO.getClass(), Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
if(propertyDescriptors != null) {
for(PropertyDescriptor propertyDescriptor : propertyDescriptors) {
Method setMethod = propertyDescriptor.getWriteMethod();
DBInfo dbInfo = setMethod.getAnnotation(DBInfo.class);
if(dbInfo != null) {
//获取dao中dataSource的实体类ComboPooledDataSource
Class dataSourceClass = propertyDescriptor.getPropertyType();
DataSource dataSource = (DataSource) dataSourceClass.newInstance();
dataSource = getDataSourceByDBInfo(dbInfo, dataSource);
setMethod.invoke(commDAO, dataSource);
}
}
}
}catch(Exception e) {
e.printStackTrace();
}
return commDAO;
} }

建立测试类

 package org.guangsoft.annotation.service;

 import java.sql.Connection;

 import javax.sql.DataSource;

 import org.guangsoft.annotation.dao.CommDAO;
import org.guangsoft.annotation.utils.JDBCUtil2; public class CommService { public static void main(String args[]) throws Exception {
CommDAO commDAO = JDBCUtil2.createCommDAO();
DataSource dataSource = commDAO.getDataSource();
Connection connection = dataSource.getConnection();
System.out.println(connection);
} }

测试结果:成功

深入JAVA注解之方法注解的更多相关文章

  1. IDEA设置类注解和方法注解(详解)

    从eclipse工具到IDEA工具的转化,发现IDEA工具配置注释模板变的不一样了,不说废话了,直接开始 一.设置类注解模板(在创建类的时候自动填充模板) /** * @ProjectName: ${ ...

  2. 【代码周边】Idea设置类注解和方法注解(带图)

    Idea版本: 类注解 打开setting→Editor→Code Style→File and Code Templates /** * Created with IntelliJ IDEA. * ...

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

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

  4. 《Effective Java》学习笔记 —— 枚举、注解与方法

    Java的枚举.注解与方法... 第30条 用枚举代替int常量 第31条 用实例域代替序数 可以考虑定义一个final int 代替枚举中的 ordinal() 方法. 第32条 用EnumSet代 ...

  5. 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

    官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...

  6. 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)

    主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...

  7. Java学习:Annotation注解

    Annotation不算常用的技术,早前用它写了一些玩意儿,过了一年又忘干净了,今天写点东西记下来,以备再忘之需. java.lang.annotation,接口 Annotation.对于Annot ...

  8. Java核心技术点之注解

    本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...

  9. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

随机推荐

  1. Linux:file命令显示自定义文件类型

    file 命令可以查看文件类型信息,原理见: 非常Linux-file命令与magic file 修改 /ect/magic 文件后,可用 file 命令显示自定义文件类型信息. man magic ...

  2. es新增字段,并设置默认值

    重新设置mapping 添加新的字段. 设置es允许脚本执行:elasticsearch.yml script.inline: true 然后执行脚本 POST linewell_assets_mgt ...

  3. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

  4. 如何删除帝国cms面包屑导航中首页链接的/index.html

    前面一篇"帝国cms面包屑导航的首页链接锚文本改成关键字"中xmyanke有写到改首页链接的方法,但是感觉比较麻烦,这里就说说如何删除帝国cms面包屑导航中首页链接的/index. ...

  5. visual studio code 的必装推荐插件plugin, vscode, vsc

    An Old Hope Theme     (theme, 推荐,且推荐它的 classic theme,安装后在颜色选项里选择,该插件的定制见文末) Cobalt2     (theme) Drac ...

  6. (转)Kangle配置文件

    kangle配置文件 (重定向自Kangle配置文件) 目录 [隐藏] 1配置文件介绍 2重新加载配置文件 3config 3.1request和response(配置访问控制) 3.2listen( ...

  7. 通过反射,获取linkedHashMap的最后一个键值对。对map按照值进行排序。

    1:通过反射,获取linkedHashMap的最后一个键值对. Map<Integer, Integer> map = new LinkedHashMap<>(); Field ...

  8. end=‘’

    print('----------------') a = ['aa','bb','cc','dd','ee'] for i in range(len(a)): print(i,a[i])#默认换行 ...

  9. testng入门教程2用TestNG编写测试及执行测试

    编写TestNG测试基本上包括以下步骤: 测试和编写业务逻辑,在代码中插入TestNG的注解.. 添加一个testng.xml文件或build.xml中在测试信息(例如类名,您想要运行的组,等..) ...

  10. php 非递归实现分类树

    本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限 ...