深入JAVA注解之方法注解
以获取数据库连接为例,建立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注解之方法注解的更多相关文章
- IDEA设置类注解和方法注解(详解)
从eclipse工具到IDEA工具的转化,发现IDEA工具配置注释模板变的不一样了,不说废话了,直接开始 一.设置类注解模板(在创建类的时候自动填充模板) /** * @ProjectName: ${ ...
- 【代码周边】Idea设置类注解和方法注解(带图)
Idea版本: 类注解 打开setting→Editor→Code Style→File and Code Templates /** * Created with IntelliJ IDEA. * ...
- ARTS打卡计划第二周-Share-使用java注解对方法计时
现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...
- 《Effective Java》学习笔记 —— 枚举、注解与方法
Java的枚举.注解与方法... 第30条 用枚举代替int常量 第31条 用实例域代替序数 可以考虑定义一个final int 代替枚举中的 ordinal() 方法. 第32条 用EnumSet代 ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...
- Java学习:Annotation注解
Annotation不算常用的技术,早前用它写了一些玩意儿,过了一年又忘干净了,今天写点东西记下来,以备再忘之需. java.lang.annotation,接口 Annotation.对于Annot ...
- Java核心技术点之注解
本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
随机推荐
- return 通过文件后缀名得到的函数字符串
<?php//图片处理工具类class Image{//属性private $thumb_width; //缩略图的宽private $thumb_height;//错误属性public $th ...
- Nginx配置认证登录
本配置实现Nginx认证登录以免重要信息暴露在公网 日志收集ELK展示工具kibana免费版不支持密码验证,需要设置Nginx反向代理然后关闭kibana默认端口5601使用Nginx端口登录进行用户 ...
- 洛谷P2564 生日礼物【单调队列】
题目背景 四川2009NOI省选 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可 ...
- python中的字符串切片
python中的字符串切片,似乎有点乱,例如: >>>pystr='Python' >>>pystr[2:5] 就会输出 'tho' 这该怎样理解呢?中括号[2:5 ...
- 2018牛客网暑期ACM多校训练营(第二场) J - farm - [随机数哈希+二维树状数组]
题目链接:https://www.nowcoder.com/acm/contest/140/J 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K ...
- Image processing in Python
http://scikit-image.org/docs/dev/auto_examples/
- pyqt5核心-信号与槽(第二弹)
果: from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.s ...
- NYOJ-1073 最小值
http://acm.nyist.net/JudgeOnline/problem.php?pid=1073 # include<stdio.h> # include<stdlib.h ...
- 使用webpy创建一个简单的restful风格的webservice应用
下载:wget http://webpy.org/static/web.py-0.38.tar.gz解压并进入web.py-0.38文件夹安装:easy_install web.py 这是一个如何使用 ...
- hduPiggy-Bank(完全背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1114 此题就是最简单的完全背包,顺序!!! for i=1..N for v=0..V f[v]=max{f[v ...