深入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 ...
随机推荐
- 小程序中navigator和wx.navigateTo,wx.redirectTo,wx.reLaunch,wx.switchTab,wx.navigateBack的用法
如果用一句话来表明navigator和API中wx.系列的跳转有什么区别,那就是navigator是在wxml中用标签添加open-type属性来达到和wx.系列一样的效果. navigator的属性 ...
- poj1743 Musical Theme【后缀数组】【二分】
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 35044 Accepted: 11628 D ...
- Codeforces 349C - Mafia
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 最长上升子序列 OpenJ_Bailian - 2757 dp模板
第一种是用以前状态更新当前状态(人人为我) 第二种是用当前状态更新以后状态(我为人人) 都是n^2代码: 对于人人为我的更新方法,可以用数据结构储存“人人”对其进行线性\二分优化. ; int a[m ...
- Java Hash Collision之数据生产
上一篇文章一种高级的DoS攻击-Hash碰撞攻击我通过伪造Hash Collision数据实现了对Java的DoS攻击,下面说说如何生产大量的攻击数据. HashTable是一种非常常用的数据结构.它 ...
- 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp
正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...
- Dubbo简单环境搭建
Dubbo服务的发展和作用: 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程. 其次,当服务越来越多之后,我们需要做哪些服务治理? 最后,是d ...
- 【2014腾讯实习招聘-面试-移动client开发】
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处. https://blog.csdn.net/kana007/article/details/24375423 个人学习整理.如 ...
- css实现固定行
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现方法: overflow: hidden; te ...
- latex 安装和使用
1:下载 texlivewindows 版 http://tug.org/texlive/acquire-netinstall.html 2:双击exe文件进行安装,安装时选择 将路径添加到环境变量 ...