Rumah  >  Artikel  >  Java  >  Cara menggunakan SPI untuk mencapai penyahgandingan di Jawa

Cara menggunakan SPI untuk mencapai penyahgandingan di Jawa

王林
王林ke hadapan
2023-05-19 21:58:151400semak imbas

Ikhtisar

Nama penuh SPI ialah Antara Muka Pembekal Perkhidmatan, yang boleh digunakan untuk memulakan sambungan dan penggantian komponen rangka kerja.

Intipatinya ialah menggunakan pelaksanaan antara muka + mod strategi + fail konfigurasi untuk mencapai pemuatan dinamik kelas pelaksanaan.

Dalam penggunaan khusus, terdapat beberapa konvensyen:

(1) Ditetapkan bahawa di bawah META-INF/services/ classPath, cipta fail nama penuh antara muka

(2) Dalam fail ini, tulis nama penuh kelas pelaksanaan antara muka (jalan + nama fail Jika terdapat berbilang kelas pelaksanaan, tuliskannya dalam baris berasingan).

(3) Apabila menggunakan 2, gunakan load(Interface.class) java.util.ServiceLoader untuk mendapatkan kelas pelaksanaan dan anda boleh menggunakannya.

Perlu diperhatikan bahawa kelas pelaksanaan antara muka mesti mempunyai pembina tanpa parameter.

Kes Perlaksanaan

Dalam aplikasi ini terdapat dua modul iaitu modul A dan modul B Antara dua modul ini, modul A merupakan modul utama, B modul slave, dan B Modul bergantung pada modul A. Walau bagaimanapun, pada masa ini terdapat kelas yang dilaksanakan dalam modul B. Modul A perlu memanggil fungsi kelas ini, dan modul tidak lagi boleh bergantung pada modul B. Pada masa ini, penyahgandingan diperlukan. Dalam pelaksanaan ini, SPI digunakan untuk pelaksanaan decoupling. Pelan pelaksanaan khusus ialah:

(1) Cipta antara muka baharu dalam modul A: MyLogAppender Pelaksanaan khusus ialah:

/**
 * @author Huang gen(kenfeng)
 * @description 自定义的appender接口
 * @Since 2021/02/21
 **/

public interface MyLogAppender {

    /**
     * 获取实现的appender
     * @return  返回新建的appender对象
     * */
    Appender getAppender();
}

Antara muka ini sangat mudah dan hanya mengembalikan objek appender. Untuk operasi sebenar objek, operasi dilakukan dalam pelaksanaan antara muka.

(2) Tambah pelaksanaan antara muka ini dalam modul B. Operasi khusus ialah:

/**
 * @author Huang gen(kenfeng)
 * @description 自定义的appender
 * @Since 2021/02/21
 **/
@Component
public class MeshLogAppender extends UnsynchronizedAppenderBase<ILoggingEvent> implements MyLogAppender,ApplicationContextAware {

    private ApplicationContext applicationContext;

    public MeshLogAppender(){ }

    @Override
    public Appender getAppender() {
        MeshLogAppender meshLogAppender = new MeshLogAppender();
        return meshLogAppender;
    }

    @Override
    protected void append(ILoggingEvent iLoggingEvent) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String std = simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(iLoggingEvent.getTimeStamp()))));
        String log = std + "\t" + iLoggingEvent.getLevel() +"\t"+"--- ["+ iLoggingEvent.getThreadName()+"]\t"+iLoggingEvent.getCallerData()[0]+":\t "+iLoggingEvent.getMessage();
        FlowMessage input = new FlowMessage();
        MeshFlowService meshFlowService = SandboxSystemServiceFactory.getService(MeshFlowService.class);
        Map<String, Object> body = new HashMap<>(2);
        body.put("log",log);
        input.setTenantCode(DefaultTenant.get());
        input.setAppCode("epoch");
        input.setFlowCode("log_broadcast");
        input.setBody(body);
        FlowMessage output = meshFlowService.process(input);
        if(!StringUtils.isEmpty(output.getErrorMessage())){
            throw new RuntimeException("发布日志时,广播失败");
        }
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

Dalam pengisytiharan antara muka ini dan pelaksanaan antara muka, terdapat beberapa helah kecil untuk melaksanakan. Dalam antara muka, hanya pemerolehan kelas diisytiharkan, dan tiada kaedah khusus dilaksanakan. Dalam kelas pelaksanaan, nyatakan kelas ini, cipta kelas baharu dan kembalikannya Pada masa ini, pengguna boleh mendapatkan kelas pelaksanaan mengikut kaedah get ini, dan kemudian melakukan beberapa operasi pada kelas pelaksanaan. Menulis dengan cara ini boleh membawa dua faedah: i. Kod ini lebih ringkas, dan kod antara muka adalah mudah dan mudah difahami ii boleh disuntik terus ke kaedah get.

(3) Tambahkan fail konfigurasi dalam folder tempat kelas pelaksanaan terletak, iaitu sandbox-app-epoch-starter. Laluan lalai fail konfigurasi ialah: resources/META-INF/services /, dalam Buat soalan baharu di bawah folder ini Nama fail ialah laluan ke antara muka, dan kandungan ialah laluan ke kelas pelaksanaan. Daripada ini, antara muka-->pemetaan kelas pelaksanaan boleh dilaksanakan.

Seperti yang ditunjukkan dalam gambar di atas, nama fail ialah: com.alibaba.halo.sandbox.app.util.MyLogAppender

Kandungan dalam fail ialah: com.alibaba.lattice2. epoch.util. MeshLogAppender

Prinsipnya ialah apabila pengguna menggunakan antara muka, semua fail di bawah projek akan diimbas, nama fail ialah com.alibaba.halo.sandbox.app.util.MyLogAppender, dan maka fail ditemui berdasarkan kandungannya. Kelas pelaksanaan yang berkaitan

(4) Dalam A, anda boleh terus menggunakan antara muka untuk membuat panggilan seperti berikut:

				ServiceLoader<MyLogAppender> myLoaderInterfaceServiceLoader = ServiceLoader.load(MyLogAppender.class);
        Iterator<MyLogAppender> myLoaderInterfaceIterator = myLoaderInterfaceServiceLoader.iterator();
        while (myLoaderInterfaceIterator.hasNext()){
            MyLogAppender myLoaderInterface = myLoaderInterfaceIterator.next();

            Appender newAppender = myLoaderInterface.getAppender();
            newAppender.setName("application");
            newAppender.setContext(loggerContext);
            newAppender.start();
            rootLogger.addAppender(newAppender);
        }

As anda boleh lihat dari atas, ia boleh terus memanggil antara muka MyLogAppender, menggunakan Appender yang diperolehi melalui antara muka ini boleh diberikan terus selepas itu.

Kebaikan dan Kelemahan

Kebaikan: Penyahgandingan kod boleh dicapai

Kelemahan ialah jika terdapat beberapa kelas pelaksanaan, ia tidak boleh melalui parameter atau bendera tertentu Mendapatkan kejadian hanya boleh diperolehi melalui traversal, dan pemuatan malas tidak dapat dilaksanakan

Atas ialah kandungan terperinci Cara menggunakan SPI untuk mencapai penyahgandingan di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam