專案結構
java_annotation
├─ src
│ ├─ com.b510.hongten.annotation
│ │ └─ JDBCAnnotation.java // 註解定義
│ ├─ com.b510.hongten.jdbc
│ │ ├─ JDBCUtil.java // 被註解類別,含解析邏輯
│ │ └─ JDBCTest.java // 測試入口,實際連資料庫
自訂註解定義
@Documented
@Retention(RetentionPolicy.RUNTIME) // 執行期可見,供反射讀取
@Target(ElementType.TYPE) // 僅能標註在類別/介面上
public @interface JDBCAnnotation {
String driver() default "com.mysql.jdbc.Driver";
String dbName() default "";
String encoding() default "UTF-8";
String port() default "3306";
String host() default "localhost";
String userName() default "root";
String password() default "";
}
使用註解並反射解析
@JDBCAnnotation(dbName = "db_lucene", port = "3306", host = "192.168.0.119", userName = "root", password = "root")
public class JDBCUtil {
private static String driver, dbName, encoding, port, host, userName, password, url;
public void checkInterceptor(Class> cl) throws Exception {
if (cl.isAnnotationPresent(JDBCAnnotation.class)) {
JDBCAnnotation ann = cl.getAnnotation(JDBCAnnotation.class);
driver = ann.driver();
dbName = ann.dbName();
encoding = ann.encoding();
port = ann.port();
host = ann.host();
userName = ann.userName();
password = ann.password();
url = "jdbc:mysql://" + host + ":" + port + "/" + dbName + "?characterEncoding=" + encoding;
System.out.println("JDBCUtil 註解解析完成...");
}
}
public JDBCUtil() { checkInterceptor(JDBCUtil.class); }
// getter/setter 省略
}
測試驗證
public class JDBCTest {
public static void main(String[] args) {
JDBCUtil util = new JDBCUtil(); // 建構子自動解析註解
String sql = "select * from mymails";
// 後續使用 util.getUrl(), getUserName() 等建立連線查詢...
}
}
註解 vs 設定檔
- 優點:程式碼與配置共存,IDE 支援跳轉、重構、型別檢查,開發效率高。
- 缺點:修改配置需重編譯;不適合頻繁變動的部署參數。
- 實務:框架(Spring、Hibernate、MyBatis)大量採用註解驅動,配合設定檔互補。