Heim > Java > javaLernprogramm > So implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter

So implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter

WBOY
Freigeben: 2023-05-16 19:58:10
nach vorne
1571 Leute haben es durchsucht

    1. Der SPI-Mechanismus in SpringBoot

    Was ist SPI? Der vollständige Name ist Service Provider Interface. In einfacher Übersetzung handelt es sich um die Service-Provider-Schnittstelle, bei der es sich um einen Mechanismus zum Auffinden von Service-Implementierungen handelt. Service Provider Interface。简单翻译的话,就是服务提供者接口,是一种寻找服务实现的机制。

    其实就是一个规范定义、或者说是实现的标准。

    用生活中的例子说就是,你买了一台小米的手机。

    但是你用的充电器并不一定非要是小米充电器,你可以拿其他厂商的充电器来进行充电,只要满足协议、端口等要求,那么就是可以充电的。这也是一种热拔插的思想,并不是固定死的。

    换成代码来说也是一样的,我定义了一个接口,但是不想固定死具体的实现类,因为那样如果要更换实现类就要改动源代码,这往往是不合适的。

    那么我也可以定义一个规范,在之后需要更换实现类或增加其他实现类时,遵守这个规范,我也可以动态的去发现这些实现类。

    换在SpringBoot中,就是现在的SpringBoot这个平台定义了一些规范和标准,我现在想要让SpringBoot平台接纳我。

    我该如何做呢?

    很简单,按照它的标准和规范做事

    SpringBoot在启动的时候,会扫描所有jar包resource/META-INF/spring.factories文件,依据类的全限定名,利用反射机制将Bean

    Tatsächlich handelt es sich um eine normative Definition bzw. einen Umsetzungsstandard.

    Um ein Beispiel aus dem Leben zu verwenden: Sie kaufen ein Xiaomi-Handy.

    Aber das von Ihnen verwendete Ladegerät muss kein Xiaomi-Ladegerät sein. Sie können zum Laden auch Ladegeräte anderer Hersteller verwenden. Solange es das Protokoll, den Anschluss und andere Anforderungen erfüllt, kann es aufgeladen werden. Dies ist auch eine Hot-Swap-Idee, die nicht behoben ist.

    In Bezug auf den Code ist es dasselbe. Ich habe eine Schnittstelle definiert, aber ich wollte die spezifische Implementierungsklasse nicht korrigieren, denn wenn ich die Implementierungsklasse ändern wollte, müsste ich den Quellcode ändern. was oft unangemessen ist.

    Dann kann ich auch eine Spezifikation definieren. Wenn ich später die Implementierungsklasse ändern oder andere Implementierungsklassen hinzufügen muss, kann ich diese Implementierungsklassen auch dynamisch erkennen.
    • In SpringBoot hat die aktuelle SpringBoot-Plattform einige Normen und Standards definiert. Jetzt möchte ich, dass die SpringBoot-Plattform mich akzeptiert.

      Wie soll ich es machen?
    • Es ist ganz einfach: Machen Sie die Dinge einfach gemäß den Standards und Spezifikationen

      .
    • Wenn SpringBoot startet, scannt es alle resource/META-INF/spring.factories-Dateien des JAR-Pakets und verwendet den Reflexionsmechanismus, um Bean basierend auf dem vollständig qualifizierten zu konvertieren Name der Klasse. In den Container laden.

      2. Benutzerdefinierter Starter

      Es sind ungefähr vier Schritte:

      • Die Klasse xxxxProperties wird zum Zuordnen der Konfiguration in der Konfigurationsdatei verwendet

      • Wird zum Betreiben der Schnittstelle und des Clients von xxxx usw. verwendet, wie z. B. das OssTemplate in diesem Artikel

      • Konfigurieren Sie automatisch die Klasse xxxxAutoConfiguration und fügen Sie xxxxTemplate in den Container ein.

      • Fügen Sie xxxxAutoConfiguration zur Vaule-Sammlung von EnableAutoConfiguration in spring.factories hinzu Sie verwenden SMS, es ist eine Simulation ~, machen Sie mir keine Vorwürfe

      2.1. Bereiten Sie ein Maven-Projekt vor

      Löschen Sie das src-Verzeichnis,So implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter

      Dann erstellen Sie zwei Maven-Projekte (ich bin es gewohnt, leere Maven-Projekte zu erstellen). , tatsächlich ist das Erstellen eines SpringBoot-Projekts dasselbe)

      Der äußerste Pom.

      Dies ist die Klasse, die wir schließlich durch automatische Montage in den SpringBoot-Betrieb einfügen werdenSo implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter

      Meine hier sind OssTemplate und SmsTemplate

       <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>
      Nach dem Login kopieren
       /**
        * @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;
       }
      Nach dem Login kopieren

      2.4, AutoConfiguration

       @Data
       @ConfigurationProperties(prefix = "nzc.sms")
       public class SmsProperties {
      
           private String name;
       }
      Nach dem Login kopieren

      2.5, schreiben Sie spring.factories

      Erstellen Sie im Ressourcenverzeichnis einen META-INF-Ordner,

      Erstellen Sie eine spring.factories-Datei im META-INF-Ordner

      Der Inhalt ist

       /**
        * @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();
           }
       }
      Nach dem Login kopieren

      Wenn es mehrere gibt :

       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);
           }
       }
      Nach dem Login kopieren

      Nach diesem Schritt werden wir dieses Projekt einfügen, ein Jar-Paket erstellen und es dann in das Projekt einführen, das Sie verwenden möchten.

      2.6. Anwendungstests

      So implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter1. Sie können nur mit der Startup-Klasse testen, sonst gibt es keinen Kontext.~

       @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);
           }
      
       }
      Nach dem Login kopieren

      Oss integrieren Wenn die Konfiguration korrekt geändert wird, kann sie verwendet werden~So implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter

      Schreiben Sie die Testklasse:

         org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
           com.nzc.CommonAutoConfig
        Nach dem Login kopieren

      • Beweisen Sie, dass sie verwendet werden kann~

      • Das obige ist der detaillierte Inhalt vonSo implementieren Sie den SpringBoot-SPI-Mechanismus und den benutzerdefinierten Starter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

      Verwandte Etiketten:
      Quelle:yisu.com
      Erklärung dieser Website
      Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
      Beliebte Tutorials
      Mehr>
      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage