Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

WBOY
WBOYke hadapan
2023-05-16 19:58:101519semak imbas

    1. Mekanisme SPI dalam SpringBoot

    Apakah nama penuhnya Service Provider Interface. Dalam terjemahan mudah, ia adalah antara muka pembekal perkhidmatan, yang merupakan mekanisme untuk mencari pelaksanaan perkhidmatan.

    sebenarnya ialah takrifan standard, atau standard pelaksanaan.

    Untuk menggunakan contoh dalam kehidupan, anda membeli telefon bimbit Xiaomi.

    Tetapi pengecas yang anda gunakan tidak semestinya pengecas Xiaomi Anda boleh menggunakan pengecas daripada pengeluar lain untuk mengecas selagi ia memenuhi protokol, port dan keperluan lain, barulah ia boleh dicas. Ini juga merupakan idea boleh tukar panas, yang tidak tetap.

    Ia adalah sama dari segi kod saya mentakrifkan antara muka, tetapi saya tidak mahu membetulkan kelas pelaksanaan tertentu, kerana jika saya mahu menukar kelas pelaksanaan, saya perlu menukar. kod sumber, yang selalunya tidak sesuai.

    Kemudian saya juga boleh mentakrifkan spesifikasi apabila saya perlu menukar kelas pelaksanaan atau menambah kelas pelaksanaan lain kemudian, saya akan mematuhi spesifikasi ini secara dinamik.

    Dalam SpringBoot, platform SpringBoot semasa telah menentukan beberapa norma dan piawaian Sekarang saya mahu platform SpringBoot menerima saya.

    Apa yang perlu saya lakukan?

    Mudah sahaja, lakukan perkara mengikut piawaian dan spesifikasinya .

    Apabila SpringBoot bermula, ia akan mengimbas semua fail pakej jar resource/META-INF/spring.factories dan menggunakan mekanisme pantulan untuk memuatkan Bean ke dalam bekas berdasarkan nama kelas yang layak sepenuhnya.

    2. Pemula tersuai

    Biar saya bercakap tentang amalan kecil saya:

    Dalam pemula ini, laksanakan

    • Hantar Templat litar pintas

    • Pemasangan automatik Templat yang disimpan objek

    ~

    Di sana adalah kira-kira empat langkah:

    • Kelas xxxxProperties yang digunakan untuk memetakan konfigurasi dalam fail konfigurasi

    • Antara muka yang digunakan untuk mengendalikan xxxx dan Klien , dsb., seperti OssTemplate

    • dalam artikel ini secara automatik mengkonfigurasi kelas xxxxAutoConfiguration dan menyuntik xxxxTemplate

    • ke dalam bekas pada musim bunga.factories Tambahkan xxxxAutoConfiguration pada koleksi vaule EnableAutoConfiguration

    Saya menggunakan oss Alibaba Cloud untuk penyimpanan objek, dan konfigurasi di dalamnya semuanya tersedia Untuk mesej teks, ia adalah simulasi~ , jangan'. t salahkan saya

    Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

    2.1 Sediakan projek Maven

    Padam direktori src,

    dan kemudian buat dua projek Maven (saya secara peribadi. Kebiasaan, biasa membuat projek Maven kosong, sebenarnya mencipta projek SpringBoot adalah sama)

    Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

    Pom.xml paling luar

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.5.2</version>
         <relativePath/>
     </parent>
    
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
     </properties>
    
    
     <dependencies>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
     </dependencies>

    2.2

    digunakan untuk memetakan fail konfigurasi~

     /**
      * @author Ning Zaichun
      */
     @Data
     @ConfigurationProperties(prefix = "nzc.oss")
     public class OssProperties {
    
         private String accessKey; 
         private String secret;
         private String bucketName;
         private String url;
         private String endpoint;
     }
     @Data
     @ConfigurationProperties(prefix = "nzc.sms")
     public class SmsProperties {
    
         private String name;
     }

    2.3 Sediakan kelas yang akan disuntik

    ialah kelas yang akhirnya akan kami masukkan ke dalam operasi SpringBoot melalui pemasangan automatik

    Apa yang saya ada di sini ialah OssTemplate dan SmsTemplate

     /**
      * @author Ning Zaichun
      */
     public class OssTemplate {
    
         private OssProperties ossProperties;
    
         public OssTemplate(OssProperties ossProperties) {
             this.ossProperties = ossProperties;
         }
    
         public String test() {
             System.out.println(ossProperties.getBucketName());
             return "test";
         }
         public String upload(String filename, InputStream is) {
             // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
             String endpoint = ossProperties.getEndpoint();
             // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
             String accessKeyId = ossProperties.getAccessKey();
             String accessKeySecret = ossProperties.getSecret();
    
             // 创建OSSClient实例。
             OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
             String storePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));
    
             System.out.println(storePath);
             // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
             ossClient.putObject(ossProperties.getBucketName(), storePath, is);
    
             String url = ossProperties.getUrl() + storePath;
    
             // 关闭OSSClient。
             ossClient.shutdown();
             return url + "#" + storePath;
        }
    
         public void remove(String fileUrl) {
             // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
             String endpoint = ossProperties.getEndpoint();
             // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
             String accessKeyId = ossProperties.getAccessKey();
             String accessKeySecret = ossProperties.getSecret();
             // 填写Bucket名称。
             String bucketName = ossProperties.getBucketName();
             // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
             //2022/01/21/f0870eb3-4714-4fae-9fc3-35e72202f193.jpg
             String objectName = fileUrl;
    
             // 创建OSSClient实例。
             OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
             // 删除文件或目录。如果要删除目录,目录必须为空。
             ossClient.deleteObject(bucketName, objectName);
    
             // 关闭OSSClient。
             ossClient.shutdown();
         }
     }
     public class SmsTemplate {
    
         private SmsProperties properties;
    
         public SmsTemplate(SmsProperties properties) {
             this.properties = properties;
         }
    
         public void sendSms(String mobile, String code){
             System.out.println(properties.getName()+"=="+mobile+"===="+code);
         }
     }

    2.4, AutoConfiguration

     @EnableConfigurationProperties({
         SmsProperties.class,
         OssProperties.class
             })
     public class CommonAutoConfig {
    
         @Bean
         public SmsTemplate smsTemplate(SmsProperties smsProperties){
             return new SmsTemplate(smsProperties);
         }
    
         @Bean
         public OssTemplate ossTemplate(OssProperties ossProperties){
             return new OssTemplate(ossProperties);
         }
    
     }

    2.5, tulis spring.factories

    Buat fail META-INF folder direktori,

    Buat fail spring.factories

    di bawah folder META-INF kandungannya

     org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
       com.nzc.CommonAutoConfig

    Jika terdapat berbilang fail: .

     org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
       com.nzc.CommonAutoConfig \
       com.xxx.xxx

    Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

    Selepas mencapai langkah ini, kami akan mencipta pakej Jar untuk projek ini, dan kemudian memperkenalkannya dalam projek yang akan digunakan.

    Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

    2.6. Pengujian Aplikasi

    • 1. Buat kelas permulaan SpringBoot hanya boleh dilakukan jika ada kelas permulaan , jika tidak, tiada konteks~

    • 2 Tulis fail konfigurasi

    •  spring:
         application:
           name: app-server
       nzc:
         sms:
           name: ningzaichun
         oss:
           accessKey: xxx
           secret: xxx
           endpoint: oss-cn-shenzhen.aliyuncs.com
           bucketName: xxx
           url: xxx
    Anda boleh mengubah suai konfigurasi oss dengan betul. ~

    Tulis kelas ujian:

     @RunWith(SpringRunner.class)
     @SpringBootTest(classes = AppServerApplication.class)
     public class TemplateTest {
    
         @Autowired
         private OssTemplate ossTemplate;
         @Test
         public void testOss(){
             String s = ossTemplate.test();
             System.out.println(s);
         }
         @Test
         public void testUpload(){
             try {
                 File file = new File("D:\evectionflow01.png");
                 InputStream inputStream = new FileInputStream(file);
                 ossTemplate.upload("123.jpg",inputStream);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
         }
         @Autowired
         private SmsTemplate smsTemplate;
    
         @Test
         public void testSendSms(){
             smsTemplate.sendSms("17670090715","123456");
         }
     }

    Buktikan bahawa ia boleh digunakan~

    Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan mekanisme SpringBoot SPI dan pemula tersuai. 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