Java Spring Recruitment Interview Sprint Series:Springアノテーションの詳細な分析

関連する質問

  • アノテーションを導入する理由
  • メタアノテーションとは
  • Springの一般的な注釈は何ですか
  • SpringBootの一般的なアノテーションは何ですか
  • SpringCloudの一般的なアノテーションは何ですか

アノテーションを導入する理由

アノテーションはJDK1.5で導入された機能です。アノテーションは、クラスおよびメソッドの拡張識別子と見なすことができます。これらの識別子は、コンパイル、クラスのロード、および実行時に読み取ることができ、対応する処理を実行できます。アノテーションを付ける前は、xml構成を介してのみ行うことができます。XML構成の不便さと、構成とコードの分離のために、コードを読むのは簡単ではありません。遅いアノテーションは、xml構成の方法に取って代わります。

メタアノテーションとは

メタアノテーションは、他のアノテーションを説明するためのアノテーションです。メタアノテーションは、アノテーションをカスタマイズするときに使用できます。Java 5は、@ Documented、@ Target、@ Retention、および@合計の4つのアノテーションを定義します。Java 8は、@ Repeatableと@Nativeの2つのアノテーションを追加します

  • @Documented

@Documentedはマークアノテーションであり、メンバー変数はありません。@Documentedアノテーションで装飾されたアノテーション付きクラスは、JavaDocツールによってドキュメントに抽出されます。デフォルトでは、JavaDocにはアノテーションが含まれていませんが、アノテーションを宣言するときに@Documentedが指定されている場合、JavaDocなどのツールによって処理されるため、アノテーションタイプ情報は生成されたヘルプドキュメントに含まれます。javadoc -d doc MyAnnotation.java XXXX.javaこれを使用してjavadocを生成します

@Documented
@Target({
    
     ElementType.TYPE, ElementType.METHOD })
public @interface MyDocumented {
    
    
    public String value() default "这是@Documented注解";
}
// Target为什么要加个ElementType.TYPE,是因为生成javadoc的时候你得知道是哪个类啊
@MyDocumented
public class DocumentedTest {
    
    
    /**
        * 测试document
        */
    @MyDocumented
    public String Test() {
    
    
        return "C语言中文网Java教程";
    }
}

javac MyDocumented.java DocumentedTest.java
javadoc -d doc MyDocumented.java DocumentedTest.java

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-Rplhib9e-1613613847462)(image / documentsed-annotation.png)]

  • @Target

@Targetアノテーションは、アノテーションの使用範囲、つまり@Targetによって変更されたアノテーションを使用できる場所を指定するために使用されます。@Targetアノテーションには、該当するターゲットを設定するためのメンバー変数(値)があります。値は、java.lang.annotation.ElementType列挙型の配列です。次の表に、ElementTypeの一般的に使用される列挙定数を示します。

PACKAGE 用于包
TYPE 用于类、接口(包括注解类型)或enum声明
CONSTRUCTOR 用于构造方法
METHOD 用于方法
FIELD 用于成员变量(包括枚举常量)
LOCAL_VARIABLE 用于局部变量
PARAMETER 用于类型参数(JDK1.8新增)
  • @Retention

@Retentionは、アノテーションのライフサイクル、つまりアノテーションが保持される時間の長さを表すために使用されます。@Rententionアノテーションのメンバー変数値は、保持ポリシーを設定するために使用されます。値はjava.lang.annotation.RententionPolicy列挙型です。RententionPolicyには3つの列挙定数があります。

SOURCE 在源文件中有效,当Java文件编译成class文件的时候,注解被遗弃
CLASS 在class文件中有效, 但jvm加载class文件时被遗弃,这是默认的生命周期
RUNTIME 在运行时有效,注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
这3个生命周期分别对应于:Java源文件 -> .class文件 -> 内存中的字节码
  • @Inherited

@AliExpressはマークアノテーションであり、アノテーションを継承できることを指定するために使用されます。@AliExpressでアノテーションが付けられたClassクラスは、このアノテーションがClassクラスのサブクラスに使用できることを意味します。

  • @Repeatable

@Repeatableアノテーションは、Java 8に新しく追加されたもので、メソッド、変数、またはクラスでアノテーションを再利用する問題を解決します。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Values {
    
    
    Value[] value();
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Values.class)
public @interface Value {
    
    
    String value() default "value";
}

public class AnnotationClass {
    
    

    @Value("hello") // 这里通过反射获取方法的注解class是Values,而不是Value
    @Value("world")
    public void test(String var1, String var2) {
    
    
        System.out.println(var1 + " " + var2);
    }
}
  • @Native

@Nativeアノテーションで変更されたメンバー変数は、ネイティブコードで参照できます

Springの一般的な注釈は何ですか

  • Beanのアノテーションを宣言します

    • @Componentコンポーネントには明確な役割はありません。関数とスコープ:オブジェクトをスプリングコンテナにロードします。最も基本的な存在であり、多くのアノテーションが継承されます。属性値は1つだけで、デフォルト値は「
    • @Controllerは、コントローラーの宣言であるプレゼンテーション層で使用されます。機能と範囲:サービスのようにコントローラーに作用する注釈は、事業領域によって区別されます。文字列を返して、jsp、ftl、htmlなどのテンプレートページにジャンプしたり、エンティティオブジェクトを返したりできます。
    • @RestControllerはプレゼンテーション層で使用され、JSON形式でデータを返します。@Controller + @ ResponseBodyと同等
    • @Serviceは、ビジネスロジック層で使用されます。機能とスコープ:これは通常、サービスレイヤーのアノテーションに使用され、コンポーネントコンポーネントを継承します。これは基本的に同じであり、ビジネススコープを区別するのに便利です。
    • @Repositoryは、データアクセス層で使用されます。機能と範囲:daoレイヤーに作用するアノテーション。JPAをよく使用する多くの学生はこのことを知っています。これは基本的にサービスと同じですが、ビジネス分野では異なります。
    @Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。
    
  • 注入されたBeanの注釈

    • @Autowired関数とスコープ:クラスメンバーの変数、メソッド、コンストラクターに注釈を付けて、自動アセンブリの作業を完了することができます。実際には、コンテナー内のオブジェクトを取得することです。@Autowiredを使用して、setメソッドとgetメソッドを削除します。
    注意事项:
    在使用@Autowired时,首先在容器中查询对应类型的bean
    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
    如果查询的结果不止一个,那么@Autowired会根据名称来查找。
    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
    
    • @ResourceはJSR-250によって提供されます。名前に基づく自動アセンブリの場合、通常、name属性が指定されます。これは、変数およびセッターメソッドで使用できます。
    • @InjectはJSR-330によって提供され、javax.inject.Injectにインポートする必要があります。注入を実現するには、タイプbyTypeに従って自動アセンブリが実行されます。名前でアセンブルする必要がある場合は、@ Namedと協力する必要があります。これは、変数、セッターメソッド、およびコンストラクターで使用できます。めったに使用しません。
  • Java構成クラスはソリューションを懸念しています

    • @Configurationは、現在のクラスが構成クラスであることを宣言します。これは、xml形式のSpring構成と同等です。構成クラスを定義するために使用され、xml構成ファイルを置き換えることができます。注釈付きクラスには1つ以上の@Bean注釈付きメソッドが含まれます
    • メソッドの@Beanアノテーションは、現在のメソッドの戻り値がxmlではなくBeanであることを宣言しています。@Bean:Springの@Beanアノテーションは、メソッドにBeanオブジェクトを生成するように指示するために使用され、このBeanオブジェクトは管理のためにSpringに渡されます。Beanオブジェクトを生成するメソッドSpringは1回だけ呼び出し、その後SpringはBeanオブジェクトを独自のIOCコンテナに配置します。SpringIOCコンテナは1つ以上のBeanを管理します。これらのBeanは、@ Configurationアノテーションの下に作成する必要があります。メソッドで@Beanアノテーションを使用すると、このメソッドを管理のためにSpringに渡す必要があることを示します。
    @Configuration
    public class AppConfig {
        // 未指定bean 的名称,默认采用的是 "方法名" + "首字母小写"的配置方式
        @Bean
        public MyBean myBean(){
            return new MyBean();
        }
    }
    
    public class MyBean {
    
        public MyBean(){
            System.out.println("MyBean Initializing");
        }
    }
    
      * @Scope注解设置Spring容器如何新建Bean实例
          * Singleton 默认模式,单例,一个Spring容器中只有一个bean实例
          * Protetype 每次调用新建一个bean
          * Request(web项目中,给每个http request新建一个bean)
          * Session(web项目中,给每个http session新建一个bean)
          * GlobalSession(给每个global http session新建一个bean实例)
      * @PostConstruct由JSR-250提供,在构造函数执行完之后执行,等价于xml中bean配置的的initMethod
      * @PreDestory由JSR-250提供,在Bean销毁之前执行,等价于xml中bean配置的destroyMethod
    
    • @ComponentScanは、xmlの代わりにComponentをスキャンするために使用されます。機能とスコープ:現在のクラスのすべてのオブジェクトをスキャンします。コンポーネントが最も基本的な理由は何ですか?この注釈をスキャンすることです。非常に巧妙に設計されており、複数のパッケージをスキャンできます。
    • @WishlyConfigurationは、@ Configurationと@ComponentScanの組み合わせアノテーションであり、ほとんど使用されません。
  • アスペクト(AOP)関連のソリューション

    • @Aspectは(クラスで)アスペクトを宣言し、@ After、@ Before、@ Aroundを使用してアドバイス(アドバイス)を定義します。パラメーターとしてインターセプトルール(カットポイント)を直接使用できます。Java構成クラスで@EnableAspectJAutoProxyアノテーションを使用して、SpringによるAspectJプロキシ(クラス上)のサポートを有効にします。
      • @Afterは、メソッドが実行された後に実行されます(メソッド上で)
      • @Beforeは、メソッドが実行される前に実行されます(メソッド上で)
      • @Aroundは、メソッドが実行される前後に(メソッド上で)実行されます。
      • @PointCutはカットポイントを宣言します
  • 環境スイッチ

    • @Profileは、環境のActiveProfilesを設定することにより、現在のコンテキストが使用する必要のある構成環境(クラスまたはメソッド)を設定します
    @PropertySource("classpath:/user.properties")
    @Configuration
    public class MainConfigOfProfile implements EmbeddedValueResolverAware{
          
          
    
        @Profile("test")
        @Bean("testUser")
        public User testUser()  {
          
          
        User a =new User();
            return a;
        }
    
        @Profile("dev")
        @Bean("devUser")
        public User devUser()  {
          
          
        User a =new User();
            return a;
        }
    }
    
    • @Conditionalは、このアノテーションを使用して、Conditionインターフェイスを実装し、matchesメソッドを書き直して、Beanが(メソッド上で)インスタンス化されているかどうかを判断することにより、Beanをアクティブ化するための条件を定義します。
    @Configuration
    public class BeanConfig {
          
          
    
        //只有一个类时,大括号可以省略
        //如果WindowsCondition的实现方法返回true,则注入这个bean    
        @Conditional({
          
          WindowsCondition.class})
        @Bean(name = "bill")
        public Window window(){
          
          
            return new Window();
        }
    
        //如果LinuxCondition的实现方法返回true,则注入这个bean
        @Conditional({
          
          LinuxCondition.class})
        @Bean("linux")
        public Linex linux(){
          
          
            return new Linex();
        }
    }
    
  • 構成に関する注意事項

    • @Valueアノテーション
      @Value("normal")
      private String normal; // 注入普通字符串
      
      @Value("#{systemProperties['os.name']}")
      private String systemPropertiesName; // 注入操作系统属性
      
      @Value("#{ T(java.lang.Math).random() * 100.0 }")
      private double randomNumber; //注入表达式结果
      
      @Value("#{beanInject.another}")
      private String fromAnotherBean; // 注入其他Bean属性:注入beanInject对象的属性another,类具体定义见下面
      
      @Value("classpath:com/hry/spring/configinject/config.txt")
      private Resource resourceFile; // 注入文件资源
      
      @Value("http://www.baidu.com")
      private Resource testUrl; // 注入URL资源
      
    • @PropertySourceは、構成ファイル(クラス上)をロードします
    @PropertySource(value = {
          
          "classpath:test.properties"})
    @Component
    @ConfigurationProperties(prefix = "test")
    public class Test {
          
          
        private Integer id;
        private String lastName;
    }
    
  • 非同期関連

    • @EnableAsyncは、非同期タスクのサポートを有効にするようにクラスで構成されます
    • @Asyncは、beanメソッドの実際の実行でこのアノテーションを使用して、非同期タスクであることを宣言します(メソッドまたはクラスのすべてのメソッドは非同期になり、非同期タスクを有効にするには@EnableAsyncが必要です)
  • 時限タスク

    • @EnableSchedulingは、スケジュールされたタスクのサポートを有効にするようにクラスで構成されます
    • @Scheduledは、これがcron、fixDelay、fixRate、およびメソッドで使用されるその他のタイプを含むタスクであることを宣言します。最初にスケジュールされたタスクのサポートをオンにする必要があります
  • 注釈を有効にする*

    • @EnableAspectJAutoProxyはAspectJ自動プロキシのサポートを開始します
    • @EnableAsyncは、非同期メソッドのサポートを有効にします
    • @EnableSchedulingは、スケジュールされたタスクのサポートを開きます
    • @EnableWebMvcは、WebMVCの構成サポートを有効にします
    • @EnableConfigurationPropertiesは、@ ConfigurationPropertiesアノテーション構成Beanのサポートを開始します
    • @EnableJpaRepositoriesは、SpringDataJPAリポジトリのサポートを開始します
    • @EnableTransactionmanagementは、アノテーション付きトランザクションのサポートを有効にします
    • @EnableCachingは、注釈付きキャッシュのサポートを開きます
  • 永続層アノテーション

    • @TableField(value = "data table field"、exist = true / false)は、属性がデータベーステーブルフィールドであることを示します
    • @TableName:データベーステーブル関連
    • @TableId:テーブルの主キーID
    • @JsonIgnore:この関数は、jsonのシリアル化、シリアル化、および逆シリアル化が影響を受ける場合に、JavaBeanの一部のプロパティを無視することです。
    • @JsonPropertyは、パラメーターのフィールドをDTOフィールドに変換するために使用されます
    • @Transactional:宣言型トランザクションアノテーション、アノテーションはメソッド上にあります
    Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出个RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚。
    1 让checked例外也回滚:在整个方法前加上@Transactional(rollbackFor=Exception.class)
    2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
    3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
    注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
    
  • その他の注意事項

    • @CrossOriginは、クロスドメインリクエストをサポートするためにクラスとメソッドで使用されます
    • @ExceptionHandlerは、例外の処理ロジックを宣言するためにメソッドレベルで使用されます
    • @ControllerAdviceグローバル例外処理、グローバルデータバインディング、グローバルデータ前処理
    @ControllerAdvice
    public class MyGlobalExceptionHandler {
          
          
        @ExceptionHandler(Exception.class)
        public ModelAndView customException(Exception e) {
          
          
            ModelAndView mv = new ModelAndView();
            mv.addObject("message", e.getMessage());
            mv.setViewName("error");
            return mv;
        }
    }
    
    @ControllerAdvice
    public class MyGlobalExceptionHandler {
          
          
        @ModelAttribute(name = "md")
        public Map<String,Object> mydata() {
          
          
            HashMap<String, Object> map = new HashMap<>();
            map.put("gender", "女");
            return map;
        }
    }
    

SpringCloudの一般的なアノテーションは何ですか

  • SpringCloud
    • @SpringBootApplicationはSprnigBootプロジェクトのコアアノテーションであり、目的は自動構成を有効にすることです
    • @EnableDiscoveryClientアノテーションは、spring-cloud-common依存関係に基づいており、クラスパスに実装されています
    • @EnableEurekaClientアノテーションは、spring-cloud-netflixの依存関係に基づいており、eurekaでのみ使用できます。
    • @EnableEurekaServerは、現在のマイクロサービスをEurekaレジストリとしてマークし、他のマイクロサービスの登録を受け取ります。
    • @LoadBalanced:このアノテーションは、リボンの負荷分散を開始するようにRestTemplateを構成する構成クラスメソッドに記述されています
    • @EnableFeignClients:feignをサポートするためにメインプログラムに書き込みます
    • @HystrixCommand(fallbackMethod = "Your method")
    • @EnableCircuitBreaker:Hystrixサーキットブレーカーメカニズムのサポートを有効にする
    • @FeignClient(value = "service name"、fallbackFactory = FallbackFactory.classを実装するクラス):サービスの低下を実現
    • @EnableHystrixDashboard:メインプログラムに追加してサービスの監視を開始します
    • @FeignClient(value = "service name"):リモートサービスを呼び出すためのインターフェイスへの書き込み
    • @EnableZuulProxy:メインプログラムに書き込み、zuulルーティングアクセス機能を開始します

参考記事

  • http://m.biancheng.net/view/7009.html

おすすめ

転載: blog.csdn.net/weixin_43314519/article/details/113842207