Panduan Lengkap Spring Boot 4 · Pelajaran

Petunjuk Masa Jalan untuk Refleksi dan Sumber

Daftarkan petunjuk refleksi, proksi dan sumber supaya ciri dinamik kekal berfungsi selepas penyusunan asli.

Pelajaran 2 daripada 413 langkah

Petunjuk Masa Jalan untuk Refleksi dan Sumber ialah pelajaran Panduan Lengkap Spring Boot 4 percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Panduan Lengkap Spring Boot 4, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Panduan Lengkap Spring Boot 4 merangkumi sejumlah 4 pelajaran.

Mengapa Imej Natif Mengganggu Reflection

Penyusunan natif GraalVM menggunakan analisis dunia tertutup: pada masa build, penyusun mesti melihat setiap kelas, kaedah dan medan yang mungkin dicapai. Laluan kod yang tidak dapat dibuktikan boleh dicapai secara statik akan dialih keluar daripada binari akhir.

  • Reflection (Class.forName, getDeclaredMethod) menyembunyikan sasaran daripada analisis statik.
  • Proksi dinamik yang dijana pada masa jalan tidak mempunyai kelas untuk diimbas pada masa build.
  • Sumber yang dimuatkan melalui getResourceAsStream tidak disertakan melainkan diisytiharkan.

Penyelesaiannya ialah membekalkan metadata eksplisit yang dipanggil petunjuk masa jalan kepada penganalisis supaya unsur ini dikekalkan dalam imej.

Sumbangan Automatik Spring Boot

Spring Boot 4 dan enjin AOT (lebih awal) sudah mendaftarkan petunjuk untuk kebanyakan dalaman rangka kerja: bean @Component, kelas @ConfigurationProperties, DTO terikat Jackson yang dicapai melalui pengawal, dan kelas konfigurasi automatik.

Anda hanya perlu menulis petunjuk anda sendiri apabila melakukan sesuatu yang tidak dapat dijejaki oleh enjin AOT, seperti:

  • Mencipta tika kelas secara reflektif apabila anda memuatkannya berdasarkan nama daripada konfigurasi.
  • Mensiri jenis yang tidak dirujuk oleh mana-mana pengawal atau repositori.
  • Membaca fail sumber bukan classpath-scanned pada masa jalan.
  • Mencipta proksi dinamik JDK untuk antara muka yang anda bina sendiri.

Antara Muka RuntimeHintsRegistrar

Titik masuk program utama ialah RuntimeHintsRegistrar. Anda melaksanakan satu kaedah, registerHints, yang menerima objek RuntimeHints yang menyediakan subpendaftaran untuk pantulan, sumber, proksi, pensirilan dan himpunan sumber.

Parameter ClassLoader membolehkan anda mendaftarkan sesuatu secara bersyarat hanya apabila jenis tersebut benar-benar wujud pada laluan kelas.

package com.example.demo.hints;

import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;

public class MyRuntimeHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        // reflection, resources and proxies are registered here
    }
}

Mendaftarkan Petunjuk Pantulan

Gunakan hints.reflection().registerType(...) dan hantarkan kategori ahli yang diperlukan. Kategori ialah suis berbutir kasar yang memberitahu GraalVM ahli mana yang perlu dikekalkan supaya boleh dicapai melalui pantulan.

  • INVOKE_DECLARED_CONSTRUCTORS — kekalkan pembina supaya boleh dipanggil.
  • INVOKE_DECLARED_METHODS — kekalkan kaedah supaya boleh dipanggil.
  • DECLARED_FIELDS — kekalkan medan supaya boleh dibaca atau ditulis.

Berikan hanya perkara yang benar-benar digunakan; petunjuk yang terlalu luas akan membesarkan imej.

import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;

public class ReflectionHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        hints.reflection().registerType(
            com.example.demo.PaymentProcessor.class,
            MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
            MemberCategory.INVOKE_DECLARED_METHODS);
    }
}

Mengaktifkan Petunjuk dengan @ImportRuntimeHints

Pendaftar tidak melakukan apa-apa sehingga Spring diarahkan untuk menjalankannya. Anotasikan mana-mana kelas konfigurasi atau komponen dengan @ImportRuntimeHints, sambil merujuk kepada pendaftar anda. Enjin AOT kemudiannya akan memanggilnya semasa binaan.

Letakkannya bersebelahan dengan kod yang memerlukan petunjuk tersebut supaya hubungannya mudah ditemui.

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportRuntimeHints;

@Configuration
@ImportRuntimeHints(ReflectionHints.class)
public class PaymentConfig {
    // beans that rely on reflective access to PaymentProcessor
}

Pendaftaran Bersyarat dengan TypeReference

Jika sesuatu kelas mungkin tiada semasa binaan, daftarkannya mengikut nama menggunakan TypeReference dan bukannya literal .class yang mengikat secara langsung. Gabungkan dengan pemeriksaan kewujudan supaya petunjuk hanya ditambahkan apabila jenis tersebut berada pada laluan kelas.

Corak ini lazim dalam pustaka pemula yang menyesuaikan diri dengan kebergantungan pilihan.

import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.aot.hint.TypeReference;
import org.springframework.util.ClassUtils;

public class OptionalHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        if (ClassUtils.isPresent("com.example.optional.LegacyAdapter", classLoader)) {
            hints.reflection().registerType(
                TypeReference.of("com.example.optional.LegacyAdapter"),
                MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
        }
    }
}

Mendaftarkan Petunjuk Sumber

Fail yang dimuatkan dengan getResourceAsStream atau ClassPathResource mesti diisytiharkan, jika tidak fail tersebut akan hilang daripada binari natif. Daftarkan laluan tepat atau corak gaya glob melalui hints.resources().

  • registerPattern("config/*.json") — sertakan sumber laluan kelas yang sepadan.
  • registerResource(...) — sertakan satu Resource yang diketahui.
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;

public class ResourceHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        hints.resources()
             .registerPattern("templates/email/*.html")
             .registerPattern("data/countries.json");
    }
}

Mendaftarkan Petunjuk Proksi

Proksi dinamik JDK yang dicipta dengan Proxy.newProxyInstance memerlukan setiap antara muka yang dilaksanakan diisytiharkan, kerana GraalVM perlu menjana kelas proksi tersebut semasa binaan. Gunakan hints.proxies().registerJdkProxy(...) dengan set antara muka yang lengkap.

Spring mendaftarkan proksi untuk @Transactional dan antara muka repositorinya sendiri secara automatik; anda hanya perlu menambah petunjuk untuk proksi yang anda cipta sendiri.

import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;

public class ProxyHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        hints.proxies().registerJdkProxy(
            com.example.demo.AuditLog.class,
            com.example.demo.Versioned.class);
    }
}

Pendaftar Berbilang Kategori yang Lengkap

Pendaftar sebenar biasanya menggabungkan beberapa jenis petunjuk. Di sini, satu pendaftar mengisytiharkan pantulan untuk strategi yang dimuatkan secara dinamik, corak sumber untuk konfigurasinya dan proksi untuk antara muka yang disambungkan oleh aplikasi semasa masa jalan.

Mengumpulkan petunjuk yang berkaitan bersama-sama mendokumentasikan dengan tepat ciri dinamik yang diperlukan oleh sesuatu ciri.

import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.aot.hint.TypeReference;

public class StrategyHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        hints.reflection().registerType(
            TypeReference.of("com.example.demo.JsonExportStrategy"),
            MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
            MemberCategory.INVOKE_DECLARED_METHODS);

        hints.resources().registerPattern("strategies/*.properties");

        hints.proxies().registerJdkProxy(
            com.example.demo.ExportStrategy.class);
    }
}

Memberi Petunjuk Pensirilan dengan @RegisterReflectionForBinding

Bagi DTO yang hanya dicapai melalui pantulan, contohnya melalui ObjectMapper yang dibina secara manual di luar mana-mana pengawal, anotasi mudah @RegisterReflectionForBinding mendaftarkan semua ahli yang diperlukan untuk pengikatan Jackson dalam satu baris, tanpa perlu menyenaraikan kategori secara manual.

Ini ialah jalan pintas yang menyerahkan tugas kepada pendaftaran pantulan yang sama di sebalik tabir.

import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.stereotype.Component;

@Component
@RegisterReflectionForBinding({ InvoiceDto.class, LineItemDto.class })
public class InvoiceExporter {
    // serializes InvoiceDto with a hand-built ObjectMapper
}

Mengesahkan Petunjuk Sebelum Beralih kepada Natif

Penyusunan imej natif mengambil masa yang lama, jadi sahkan petunjuk terlebih dahulu pada JVM. Ejen metadata kebolehcapaian GraalVM merekodkan capaian pantulan dan sumber sebenar semasa pelaksanaan ujian biasa, lalu menghasilkan metadata JSON yang boleh anda bandingkan dengan petunjuk anda.

Spring juga menyediakan RuntimeHintsPredicates untuk membuat pengesahan dalam ujian unit bahawa jenis atau sumber tertentu telah didaftarkan — maklum balas pantas tanpa binaan natif penuh.

import org.junit.jupiter.api.Test;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import static org.assertj.core.api.Assertions.assertThat;

class ReflectionHintsTest {

    @Test
    void registersPaymentProcessor() {
        RuntimeHints hints = new RuntimeHints();
        new ReflectionHints().registerHints(hints, getClass().getClassLoader());

        assertThat(RuntimeHintsPredicates.reflection()
                .onType(com.example.demo.PaymentProcessor.class))
            .accepts(hints);
    }
}

Semakan Pantas: Petunjuk Proksi

Aplikasi anda mencipta proksi dinamik JDK untuk dua antara muka anda sendiri menggunakan Proxy.newProxyInstance. Ia berfungsi pada JVM tetapi menghasilkan ralat semasa masa jalan dalam imej natif. Petunjuk manakah yang membetulkannya?

Ringkasan

Analisis dunia tertutup GraalVM menyingkirkan apa-apa yang tidak dapat dibuktikan boleh dicapai secara statik, jadi ciri dinamik memerlukan petunjuk masa jalan yang jelas.

  • Laksanakan RuntimeHintsRegistrar.registerHints dan aktifkannya dengan @ImportRuntimeHints.
  • hints.reflection().registerType(...) dengan nilai MemberCategory yang betul mengekalkan pembina, kaedah dan medan yang dicapai melalui pantulan.
  • hints.resources().registerPattern(...) menggabungkan fail yang dimuatkan semasa masa jalan.
  • hints.proxies().registerJdkProxy(...) mengisytiharkan proksi dinamik JDK tersuai.
  • @RegisterReflectionForBinding ialah jalan pintas untuk DTO pensirilan.
  • Sahkan dengan RuntimeHintsPredicates dan ejen metadata kebolehcapaian sebelum menjalankan binaan natif yang mahal.
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
21
Pelajaran
84

Soalan Lazim

Adakah pelajaran “Petunjuk Masa Jalan untuk Refleksi dan Sumber” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Panduan Lengkap Spring Boot 4, termasuk “Petunjuk Masa Jalan untuk Refleksi dan Sumber”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Panduan Lengkap Spring Boot 4 merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Petunjuk Masa Jalan untuk Refleksi dan Sumber”?

Daftarkan petunjuk refleksi, proksi dan sumber supaya ciri dinamik kekal berfungsi selepas penyusunan asli. Anda berlatih Panduan Lengkap Spring Boot 4 menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Panduan Lengkap Spring Boot 4?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Panduan Lengkap Spring Boot 4 di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Petunjuk Masa Jalan untuk Refleksi dan Sumber” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Panduan Lengkap Spring Boot 4 ini?

Ya. Setiap pelajaran Panduan Lengkap Spring Boot 4 menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pemprosesan AOT dan Saluran Binaan Asli
  2. Petunjuk Masa Jalan untuk Refleksi dan Sumber
  3. Perkongsian Data Kelas dan Penalaan Permulaan JVM
  4. Mendiagnosis dan Membetulkan Isu Keserasian Asli
← Kembali ke Panduan Lengkap Spring Boot 4