深入JAVA注解之方法注解

以获取数据库连接为例,建立maven项目

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>org.guangsoft</groupId>
 6     <artifactId>annotation</artifactId>
 7     <version>1.0</version>
 8     <packaging>war</packaging>
 9     <name>annotation</name>
10     <dependencies>
11         <dependency>
12             <groupId>com.mchange</groupId>
13             <artifactId>mchange-commons-java</artifactId>
14             <version>0.2.9</version>
15         </dependency>
16         <dependency>
17             <groupId>com.mchange</groupId>
18             <artifactId>c3p0</artifactId>
19             <version>0.9.5</version>
20         </dependency>
21         <dependency>
22             <groupId>mysql</groupId>
23             <artifactId>mysql-connector-java</artifactId>
24             <version>8.0.11</version>
25         </dependency>
26     </dependencies>
27 </project>

建立注解类

 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(ElementType.METHOD)
 9 @Retention(RetentionPolicy.RUNTIME)
10 public @interface DBInfo {
11     //属性名参考com.mchange.v2.c3p0.DriverManagerDataSource
12     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     private ComboPooledDataSource dataSource;
10     
11     @DBInfo
12     public void setDataSource(ComboPooledDataSource dataSource) {
13         this.dataSource = dataSource;
14     }
15     
16     public ComboPooledDataSource getDataSource() {
17         return dataSource;
18     }
19     
20 }

建立工厂类

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

建立测试类

 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.JDBCUtil2;
 9 
10 public class CommService {
11     
12     public static void main(String args[]) throws Exception {
13         CommDAO commDAO = JDBCUtil2.createCommDAO();
14         DataSource dataSource = commDAO.getDataSource();
15         Connection connection = dataSource.getConnection();
16         System.out.println(connection);
17     }
18     
19 }

测试结果:成功

 

原文地址:https://www.cnblogs.com/guanghe/p/10191447.html