BeanMapping
為了更加靈活的指定對映方式,0.0.2 版本引入了 @BeanMapping
註解。
註解的定義
註解定義在 bean-mapping-api
模組中,bean-mapping-core
會預設引入此模組。
package com.github.houbb.bean.mapping.api.annotation;
import com.github.houbb.bean.mapping.api.core.ICondition;
import com.github.houbb.bean.mapping.api.core.IConvert;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <p> BeanMapping 註解 </p>
*
* <pre> Created: 2019/2/19 10:11 PM </pre>
* <pre> Project: bean-mapping </pre>
*
* @author houbinbin
* @since 0.1.0
*/
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanMapping {
/**
* 欄位的名稱
* 如果不填,則預設使用欄位的名稱
* 1. 會將 source 的值賦值給 target 和當前 name 屬性一致的物件。
* @return 名稱
*/
String name() default "";
/**
* 生效條件
* 1. 預設為生效
* 2. 當放在 source 欄位上時,表示是否將值賦給 target 欄位
* 當放在 target 欄位上時,表示是否接受賦值。
* 3. source+target只有同時生效時,才會發生賦值。
* @return 具體的生效實現
*/
Class<? extends ICondition> condition() default ICondition.class;
/**
* 型別轉換
* 1. 預設不進行轉換
* 2. 為了確保轉換的確定性+靈活性。物件中指定這個屬性,不會改變物件的屬性值和型別。
* 如果要改變原來的值,那麼型別就會被限制的很多,無法足夠的靈活。
* 3. 只有當 source 的值轉換後可以設定給 target,才會將 source 轉換後的值賦值給 target 對應屬性,其他情況不會對值產生影響。
* @return 具體的轉換實現
*/
Class<? extends IConvert> convert() default IConvert.class;
}
複製程式碼
name 屬性
有時候 source 和 target 的欄位名稱可能不同,只需要通過這個屬性,讓二者保持一致即可。
ICondition 介面
用於指定賦值是否生效,可以實現目標物件有值就不被覆蓋的常見需求。
public interface ICondition {
/**
* 將原始資訊轉換為目標資訊
* @param context 當前執行上下文
* @return 轉換結果
*/
boolean condition(final IContext context);
}
複製程式碼
IContext 上下文介面
其中 IContext 是執行的上下文,便於獲取到執行的相關屬性。更加靈活的指定和實現我們的功能。
IConvert 欄位轉化介面
有時候我們希望對欄位的值進行處理,比如日期/金額格式化,列舉值顯示的處理等等。
就可以藉助這個介面,保證程式碼賦值的優雅性,提升程式碼的可複用性,更加符合 Open-Close 原則。
/**
* <p> 轉換介面 </p>
* 1. 所有的實現都應該提供預設構造器
* <pre> Created: 2019/2/19 10:15 PM </pre>
* <pre> Project: bean-mapping </pre>
*
* @param <T> 目標泛型
* @author houbinbin
* @since 0.1.0
*/
public interface IConvert<T> {
/**
* 將原始資訊轉換為目標資訊
* @param context 當前執行上下文
* @return 轉換結果
*/
T convert(final IContext context);
}
複製程式碼