Javaの理解について最初のメモを書きましたが、誰もがあまり気にしないと思います。それは単なる注釈の概念ではないでしょうか。しかし、それでも基盤は非常に重要だと感じています。注釈を最初に理解し始めたとき、私は戸惑いました。注釈の名前を書くだけで、コードはあなたが何をしたいのかを知ることができますか?人工知能と考えてください!それから私は他の友達に尋ねました、彼らも半分知識があり、途方に暮れていました。後で、説明を見に行って、ゆっくりと少し推測しました。
背が高く見えるアノテーションは、パラメーター検証、データ変換、メソッド処理フィルタリング処理などを実行できます。実際、リフレクションによってバックグラウンドでサイレントに実装されるだけであり、これらのコードは実際には名前のない論理処理です。
Javaフレームワークを一定期間使用している場合は、アノテーションの使用に多かれ少なかれさらされており、いくつかのアノテーションの効果に精通しています。たぶんもっと多くの人がSpringFamily Bucketを使用しています、@ RestController、@ ResponseBody、@ RequestBody、@ Autowired、@ Resource、@ RequestParam、@ Service、@ Component、@ Repository、@ Mapper、@ Configurationは、すべて非常に精通しています。便利。
ただ、原理がよくわからないので、コメントを開いても大混乱かもしれませんし、わざわざ読んでいません。急いで読むのは本当に頭痛の種です。これを明確に説明することはできません。今日お話しします。はじめに、フォローアップに興味がある場合は、Springソースコードの詳細な分析を見て、これらのアノテーションの実装を理解することができます。
ここで言及したいのですが、初心者の中にはそのような間違いをする人もいます。
@RestController("/demo")
public class DemoController {
@PostMapping("test")
public DefaultResponse getInfoList(@RequestBody RequestVo requestVo){
return null;
}
}
@Data
public class RequestVo {
private String uuid ;
private Integer minAge;
private String maxAge;
// 学校id必须不为空
@NotNull(message = "学校id不能为空")
private String schoolId;
}
ご覧のとおり、これは単純なSpringリクエスト受信プロセスであり、これ以上単純にすることはできません。json入力パラメーターは@RequestBodyを介してオブジェクトRequestVoに直接変換され、同時に検証schoolIdをnullにすることはできません。
もちろん、私の注意深い友人は、実際には、このチェック@NotNull(message = "学校IDを空にすることはできません")が機能しないことを発見しました。理由は単純です。前に述べたように、注釈は人工知能ではなく、 、そしてこの@NotNullは@RequestBodyと結合されておらず、Springに直接埋め込まれていないため、自動的に検証することはできません。友達がこのような問題に遭遇したかどうかはわかりません。テストでいつバグが発生したのか疑問に思いましたが、慎重にテストしないと見つけるのは非常に困難です。ハハ、雰囲気を調整してください。
実際、この@NotNullを開くと、その使用が別のアノテーション、つまり@Validと組み合わされていることがわかります。このように記述することによってのみ、nullチェックを実際に実行できます。
@PostMapping("test")
public DefaultResponse getInfoList(@Valid @RequestBody RequestVo requestVo){
return null;
}
もちろん、この@Validカプセル化は非常に古典的です。同じインターフェースが複数回要求された場合、必要に応じて異なるフィルタリングルールを実装できます。興味がある場合は、チェックアウトできます〜(主に@NotNullのグループ定義処理で) )
少し遠くに引っ張って、要点に到達し始めました。
以下に簡単な注釈を書いて入手してください。
注釈の色:
package com.example.annotion;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Color {
String value();
}
これは非常に一般的な注釈です。つまり、色です。値は色の値を示します
フルーツアップル、フルーツには自然に色があります。たとえば、リンゴを聞くと、それを知っているかもしれません。ああ、色は赤です。
package com.example.vo;
import com.example.annotion.Color;
import lombok.Data;
@Data
public class Apple {
@Color(value = "red")
private String name;
private Double price;
}
注釈の取得:
package com.example.demo;
import com.example.annotion.Color;
import com.example.vo.Apple;
import java.lang.reflect.Field;
public class MyTest {
public static void main(String[] args) throws Exception{
// 加载类
Class<?> appleClass = Class.forName("com.example.vo.Apple");
//这样也可以 Class<? extends Apple> appleClass = new Apple().getClass();
Field[] fields = appleClass.getDeclaredFields();
for (Field field:fields) {
field.setAccessible(true);
Color color = field.getAnnotation(Color.class);
if (color != null){ // 说明有Color 的注解
System.out.println("apple 的颜色是:" + color.value());
System.out.println(" 属性的名称是: " + field.getName());
}
break;
}
System.out.println("this is end.....");
}
}
出力結果:
Connected to the target VM, address: '127.0.0.1:58458', transport: 'socket'
apple 的颜色是:red
属性的名称是: name
this is end.....
Disconnected from the target VM, address: '127.0.0.1:58458', transport: 'socket'
Process finished with exit code 0
もちろん、この例を見ると、あなたは感じなければなりません---ゴミ、そのような素朴な取得操作、私もそうします!
はい、このアノテーションの分析は非常に基本的なものであり、Javaを少し学んだ人なら誰でも書くことができます。
ただし、原則は同じであり、基本は非常に重要で重要であることが多く、それを知らないと、多くのことを簡単に見落とす可能性があります。
以前の作業で使用した注釈処理について説明します。
プロジェクトでは、多くの場所にファイルをアップロードしてから、ファイル情報を保存する必要があります。ページはフロントエンドから来ており、ImageVoなど、保存する必要のあるファイルの種類が多い場合があります。もちろん、これを1つずつ処理してはいけません。面倒で、このような保存操作には少しのビジネス関係は、最も合理的であるためにカプセル化されて統一されるべきです。
もちろん、毎回パラメータを取り出してメソッドに渡すこともできますが、リクエストごとにパラメータを取得する必要がありますか?そして、より多くのパラメータレベルがある場合はどうなりますか?判断などを追加する必要があります、
もちろん、これはアノテーション+リフレクションでうまく処理できます!
今週は書いてみてください。以前は怠け者でした。何かを解決する必要があります、O(∩_∩)Oはは〜