项目目录结构

实体类:

 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注解之属性注解的更多相关文章

  1. Hibernate注解----类级别注解以及属性注解详解----图片版本

    这篇文章是我在慕课网上学习Hibernate注解的时候进行手机以及整理的笔记. 今天把它分享给大家,希望对大家有用.可以进行收藏,然后需要的时候进行对照一下即可.这样能起到一个查阅的作用. 本文主要讲 ...

  2. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  3. 35_张孝祥Java高新技术_为注解增加各种属性

    注解的作用之所以那么强大,就是因为它有属性 注解很像接口,属性很像方法.   什么是注解的属性 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是.如果还想区分出事传智播客 ...

  4. Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net

    Atitit.注解and属性解析(2)---------语法分析 生成AST  attilax总结  java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 使用解释器方式来实现生成 ...

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

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

  6. JAVA 注解教程(三)注解的属性

    简介 注解的属性也叫做成员变量,注解只有成员变量,没有方法.注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型 实例 @Targe ...

  7. Java核心技术点之注解

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

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

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

  9. SSH项目Class类的注解与属性的注解

    经过一段日子对SSH的学习,为了有利于随时能熟练的把一个SSH的项目快速的搭建起来,并且在报错的时候,将报错信息和解决 方案记录下来,每天一次的代码练习已成为家常便饭 所以,在反复练习的时候,发现Sp ...

随机推荐

  1. easyui_2----messager

    <script> $.messager.alert("这是头","这是内容"); </script> 必须放在 $(function() ...

  2. POJ-2081 Recaman's Sequence

    Recaman's Sequence Time Limit: 3000MS Memory Limit: 60000K Total Submissions: 22392 Accepted: 9614 D ...

  3. zero-shor learning 数据集

    OSR数据集下载地址: http://people.csail.mit.edu/torralba/code/spatialenvelope/ Relative Attributes Marr Priz ...

  4. MapRedece(多表关联)

    多表关联: 准备数据 ******************************************** 工厂表: Factory Addressed BeijingRedStar 1 Shen ...

  5. free详解

    用法: [oracle@server36 ~]$ free -help free: invalid option -- h usage: free [-b|-k|-m|-g] [-l] [-o] [- ...

  6. mongostat和mongotop对mongodb数据库运行状态进行监控

    --mongostat工具是mongdb自带的监控工具,可以用来监控mongodb当前状态下的运行情况: [root@slave2 ~]# /usr/local/mongodb341/bin/mong ...

  7. web 开发常见问题--GET POST 区别

    首先,get和post是什么? --两种 HTTP 请求方法:GET 和 POST HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 ...

  8. python3爬虫-爬取新浪新闻首页所有新闻标题

    准备工作:安装requests和BeautifulSoup4.打开cmd,输入如下命令 pip install requests pip install BeautifulSoup4 打开我们要爬取的 ...

  9. NYOJ 587 blockhouses 【DFS】

    blockhouses 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Suppose that we have a square city with straigh ...

  10. PAT 1067 Sort with Swap[难]

    1067 Sort with Swap(0,*) (25)(25 分) Given any permutation of the numbers {0, 1, 2,..., N-1}, it is e ...