博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入JAVA注解之属性注解
阅读量:5986 次
发布时间:2019-06-20

本文共 3777 字,大约阅读时间需要 12 分钟。

项目目录结构

实体类:

1 package org.guangsoft.annotation.entity; 2  3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7  8 @Target(value = {ElementType.FIELD, ElementType.METHOD}) 9 @Retention(RetentionPolicy.RUNTIME)10 public @interface DBInfo {11     //属性名参考com.mchange.v2.c3p0.DriverManagerDataSource12     String driverClass() default "com.mysql.jdbc.Driver";13     String jdbcUrl() default "jdbc:mysql://192.168.50.30:3306/guanghe";14     String user() default "root";15     String password() default "root";16 }

DAO层:

1 package org.guangsoft.annotation.dao; 2  3 import org.guangsoft.annotation.entity.DBInfo; 4  5 import com.mchange.v2.c3p0.ComboPooledDataSource; 6  7 public class CommDAO { 8  9     @DBInfo10     private ComboPooledDataSource dataSource;11     12     public void setDataSource(ComboPooledDataSource dataSource) {13         this.dataSource = dataSource;14     }15     16     public ComboPooledDataSource getDataSource() {17         return dataSource;18     }19     20 }

service层:

1 package org.guangsoft.annotation.service; 2  3 import java.sql.Connection; 4  5 import javax.sql.DataSource; 6  7 import org.guangsoft.annotation.dao.CommDAO; 8 import org.guangsoft.annotation.utils.JDBCUtil3; 9 10 public class CommService {11     12     public static void main(String args[]) throws Exception {13         CommDAO commDAO = JDBCUtil3.createCommDAO();14         DataSource dataSource = commDAO.getDataSource();15         Connection connection = dataSource.getConnection();16         System.out.println(connection);17     }18     19 }

util类:

1 package org.guangsoft.annotation.utils; 2  3 import java.beans.PropertyDescriptor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6  7 import javax.sql.DataSource; 8  9 import org.guangsoft.annotation.dao.CommDAO;10 import org.guangsoft.annotation.entity.DBInfo;11 12 public class JDBCUtil3 {13     14     //将注解注入到数据源类15     private static DataSource getDataSourceByDBInfo (DBInfo dbInfo, DataSource dataSource) {16         Method[] methods = DBInfo.class.getMethods();17         for(Method method : methods) {18             String name = method.getName();19             try {                20                 //注解类没有属性,反射注解类的方法名,内省出数据源类设置参数的方法, 找不到会抛异常,进入下次循环21                 PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, dataSource.getClass());22                 //注解类的方法能得到实际注解的值23                 Object value = method.invoke(dbInfo, null);24                 //用数据源的方法将注解类的值注入25                 propertyDescriptor.getWriteMethod().invoke(dataSource, value);26             } catch(Exception e) {                27                 continue;28             }29         }30         return dataSource;31     }32     33     //工厂模式下的创建DAO34     public static CommDAO createCommDAO() {35         CommDAO commDAO = new CommDAO();36         try {37             Field[] fields = commDAO.getClass().getDeclaredFields();38             if(fields != null) {39                 for(Field field : fields) {40                     field.setAccessible(true);41                     DBInfo dbInfo = field.getAnnotation(DBInfo.class);42                     if(dbInfo != null) {43                         //获取dao中dataSource的实体类ComboPooledDataSource44                         DataSource dataSource = (DataSource) field.getType().newInstance(); 45                         dataSource = getDataSourceByDBInfo(dbInfo, dataSource);46                         field.set(commDAO, dataSource);47                     } 48                 }49             }50         }catch(Exception e) {51             e.printStackTrace();52         }53         return commDAO;54     }55     56 }

结果(成功):

转载地址:http://nbylx.baihongyu.com/

你可能感兴趣的文章
[bzoj 4872][六省联考2017]分手是祝愿
查看>>
第五周-周记
查看>>
LightTable的结构(二)
查看>>
linux高级编程day08 笔记
查看>>
PYTHON3.day01RE
查看>>
由浅到深理解java反射
查看>>
linux 下 apache启动、停止、重启命令
查看>>
转-基于NodeJS的14款Web框架
查看>>
Java---变量与常量
查看>>
Struts2注解学习1
查看>>
Oracle11gr2 Linux
查看>>
LeetCode – Refresh – Two Sum
查看>>
随手备忘 ubuntu12.04 lts 安装gcc 4.8
查看>>
Facebook力推导航库:React Navigation使用详解
查看>>
dispatch_source_create创建定时器和UIWindow创建类似处
查看>>
CCF NOI1028 判断互质
查看>>
PNG文件格式
查看>>
每一帧移动的距离
查看>>
实现定时备份mysql数据库并把备份数据库邮件发送
查看>>
KVM 记录
查看>>