# 配置说明

## 目标类配置说明

因为每个类均可能拷贝到多个目标，例如：FooDto可能会拷贝到Foo，也可能拷贝到FooVo等。并且拷贝到不同目标时需要的映射配置一般来说是有差异的。

从2.3.0版本开始，所有的映射类注解（`@Mapping`/`@DictMapping`/`@Nested`）均支持目标类的配置（`targetClass`/`targetClassName`），用于区分此注解配置的作用目标，防止拷贝时发生意外的处理。

以`@Mapping`注解为例：

### 示例1

```java
class A {
   @Mapping(targetClass=B.class, field="b")
   @Mapping(targetClass=C.class, field="c")
   String a;
}
```

* A和B类的实例互相拷贝时，A.a映射字段为B.b
* A和C类的实例互相拷贝时，A.a映射字段为C.c
* A和D类（所有其他的类）的实例互相拷贝时，A.a映射字段为D.a

### 示例2

```java
class A {
   @Mapping(targetClass=B.class, field="b")
   @Mapping(targetClass=C.class, field="c")
   @Mapping(field="d")
   String a;
}
```

* A和B类的实例互相拷贝时，A.a映射字段为B.b
* A和C类的实例互相拷贝时，A.a映射字段为C.c
* A和D类（所有其他的类）的实例互相拷贝时，A.a映射字段为D.d

{% hint style="info" %}
不配置`targetClass`表示通用配置，`BeanUtils`在拷贝时会选取第一个匹配的注解，所以通用配置必须放在最后。
{% endhint %}

## 类（Class）类型的属性配置说明

某些情况下参与拷贝的类（如DTO）可能需要单独打包供其他系统使用，此时如果注解中有`Class`类型的属性，可能会因为和其他类的耦合导致打包失败（或者打包内容中包含各种不需要的类）。

从2.3.0版本开始，所有的映射类注解（`@Mapping`/`@DictMapping`/`@Nested`）中类型为`Class`的属性配置，均提供对应的className（类的全路径名）配置，用于避免和系统中其他类的耦合问题。

以`@DictMapping`注解为例：

### 修改前

```java
package demo;

class A {
   @DictMapping(targetClass=B.class, key="", resolver=MyResolver.class)
   String a;
}
```

* A和B类的实例互相拷贝时，A.a和映射字段B.a采用MyResolver类处理字典映射
* A和C类（所有其他的类）的实例互相拷贝时，A.a和映射字段C.a原样拷贝（不使用配置的字典映射）

### 修改后

```java
package demo;

class A {
   @DictMapping(targetClassName="demo.B", key="", resolverClassName="demo.MyResolver")
   String a;
}
```

修改前后的效果是相同的。

{% hint style="info" %}
className属性配置的优先级高于class属性的优先级。
{% endhint %}
