深入JAVA注解之属性注解
项目目录结构

实体类:
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(value = {ElementType.FIELD, 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 {
@DBInfo
private ComboPooledDataSource dataSource;
public void setDataSource(ComboPooledDataSource dataSource) {
this.dataSource = dataSource;
}
public ComboPooledDataSource getDataSource() {
return dataSource;
}
}
service层:
package org.guangsoft.annotation.service; import java.sql.Connection; import javax.sql.DataSource; import org.guangsoft.annotation.dao.CommDAO;
import org.guangsoft.annotation.utils.JDBCUtil3; public class CommService { public static void main(String args[]) throws Exception {
CommDAO commDAO = JDBCUtil3.createCommDAO();
DataSource dataSource = commDAO.getDataSource();
Connection connection = dataSource.getConnection();
System.out.println(connection);
} }
util类:
package org.guangsoft.annotation.utils; import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import javax.sql.DataSource; import org.guangsoft.annotation.dao.CommDAO;
import org.guangsoft.annotation.entity.DBInfo; public class JDBCUtil3 { //将注解注入到数据源类
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 {
Field[] fields = commDAO.getClass().getDeclaredFields();
if(fields != null) {
for(Field field : fields) {
field.setAccessible(true);
DBInfo dbInfo = field.getAnnotation(DBInfo.class);
if(dbInfo != null) {
//获取dao中dataSource的实体类ComboPooledDataSource
DataSource dataSource = (DataSource) field.getType().newInstance();
dataSource = getDataSourceByDBInfo(dbInfo, dataSource);
field.set(commDAO, dataSource);
}
}
}
}catch(Exception e) {
e.printStackTrace();
}
return commDAO;
} }
结果(成功):

深入JAVA注解之属性注解的更多相关文章
- Hibernate注解----类级别注解以及属性注解详解----图片版本
这篇文章是我在慕课网上学习Hibernate注解的时候进行手机以及整理的笔记. 今天把它分享给大家,希望对大家有用.可以进行收藏,然后需要的时候进行对照一下即可.这样能起到一个查阅的作用. 本文主要讲 ...
- Hibernate注解----关联映射注解以及课程总结详解----图片版本
上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...
- 35_张孝祥Java高新技术_为注解增加各种属性
注解的作用之所以那么强大,就是因为它有属性 注解很像接口,属性很像方法. 什么是注解的属性 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是.如果还想区分出事传智播客 ...
- Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 使用解释器方式来实现生成 ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- JAVA 注解教程(三)注解的属性
简介 注解的属性也叫做成员变量,注解只有成员变量,没有方法.注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型 实例 @Targe ...
- Java核心技术点之注解
本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- SSH项目Class类的注解与属性的注解
经过一段日子对SSH的学习,为了有利于随时能熟练的把一个SSH的项目快速的搭建起来,并且在报错的时候,将报错信息和解决 方案记录下来,每天一次的代码练习已成为家常便饭 所以,在反复练习的时候,发现Sp ...
随机推荐
- 替换{0}为指定的字符串(MessageFormat)
package com.text; import java.text.MessageFormat; /**替换{0}为指定的字符串*/ public class MessageFormatTest { ...
- CodeForces - 847B Preparing for Merge Sort 二分
http://codeforces.com/problemset/problem/847/B 题意:给你n个数(n<2e5)把它们分成若干组升序的子序列,一行输出一组.分的方法相当于不断找最长递 ...
- CodeForces - 950C Zebras 模拟变脑洞的天秀代码
题意:给你一个01串,问其是否能拆成若干形如0101010的子串,若能,输出所有子串的0,1 的位置. 题解:一开是暴力,然后瞎找规律, 最后找到一种神奇的线性构造法:扫一遍字符串,若为0就一直竖着往 ...
- es新增字段,并设置默认值
重新设置mapping 添加新的字段. 设置es允许脚本执行:elasticsearch.yml script.inline: true 然后执行脚本 POST linewell_assets_mgt ...
- maven package install deploy区别
package 命令完成了项目编译.单元测试.打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库install 命令完成了项目编译.单元测 ...
- python 线程,GIL 和 ctypes(转)
原文:http://zhuoqiang.me/python-thread-gil-and-ctypes.html GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程 ...
- 简单利用gulp-babel搭建es6转es5环境
es6是什么?借着这个话题,我想说:身为web前端的工作者连es6没听说,转行吧. demo的代码如下: 源码下载 或者 gitclone地址: git@git.oschina.net:sisheb/ ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- There are 2 missing blocks. The following files may be corrupted
There are 2 missing blocks. The following files may be corrupted: 步骤1,检查文件缺失情况 可以看到, blk_1074785806 ...
- 使用gunicorn部署Flask项目
[*] 本文出处:http://b1u3buf4.xyz/ [*] 本文作者:B1u3Buf4 [*] 本文授权:禁止转载 从自己的博客移动过来. gunicorn是一个python Wsgi的WEB ...