框架開發時不免會涉及到配置文件,如properties、xml以及txt等格式的文件。這里介紹框架中通過自定義注解的形式簡化配置:
- 根據需求編寫自定義注解中的屬性(這里以JDBCConfig為例,這是一個注入數據庫常用配置的注解類)
@Target是java的元注解(即修飾注解的注解),這里的@Target({METHOD,TYPE})指可以修飾方法、描述類、接口(包括注解類型) 或enum聲明。
@Retention是java中的運行時注解,可以划分為三類
1.RetentionPolicy.RUNTIME:注解不僅會被保存到class文件里,在jvm加載class文件之后仍然不會消失。
2.RetentionPolicy.CLASS:注解會被保留到class文件里,但jvm加載class文件時被遺棄,默認的生命周期如此。
3.RetentionPolicy.SOURCE:注解只會保留在源文件中,當java文件變異成class文件shi
@Inherited:允許子類繼承父類的注解
@Documented:注解表明制作javadoc時,是否將注解信息加入文檔。(添加時表示制作javadoc時將注解會加入其中)
package com.ssm.test.anno; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import java.lang.annotation.Documented; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // jdbc:sqlserver://localhost:1433;DataBaseName=sqlserverdb /** * @Title: JDBCConfig.java * @Package ctl.anno * @Description: 自定義注解類-->可用於數據庫連接 * @author chentl * @date 2017年7月7日14:38:34 * @version V1.0 */ @Target({METHOD, TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface JDBCConfig { String ip(); int port() default 1433; String database(); String encoding(); String loginName(); String password(); String driverName(); }
- 接下來直接在數據交互層通過注解的形式注入使用就OK了
/** * @Title: SelectMethod.java * @Package com.ctl.test * @Description: 獲取數據庫連接 * @author chentl * @date 2017/6/8 上午11:16:19 * @version V1.0 */ @JDBCConfig(database = "sqlserverdb", driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver", encoding = "UTF-8", ip = "192.168.1.191", loginName = "sa", password = "123") public Connection getConnection() { Connection conn = null; try { JDBCConfig jconfg=DBManager.class.getAnnotation(JDBCConfig.class); String url = jconfg.ip(); String user = jconfg.loginName(); String password = jconfg.password(); String driver = jconfg.driverName(); Class.forName(driver); conn = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } return conn; } }
- 另外,注解不僅可以用於配置信息的注入,還可以在注解中追加對字段的驗證哦~這里舉個驗證的例子。
驗證注解@NotEmpty源碼
package org.hibernate.validator.constraints; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; import javax.validation.ReportAsSingleViolation; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented @Constraint(validatedBy = { }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @ReportAsSingleViolation @NotNull @Size(min = 1) public @interface NotEmpty { String message() default "{org.hibernate.validator.constraints.NotEmpty.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; /** * Defines several {@code @NotEmpty} annotations on the same element. */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented public @interface List { NotEmpty[] value(); } }
使用
@NotEmpty(message = "密碼不能為空", groups = {AccountGroup.Add.class}) @Size(min = 6, max = 20, message = "密碼長度必須在{min}和{max}之間", groups = {AccountGroup.Add.class}) private String password;