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
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.
Es ist ganz einfach: Machen Sie die Dinge einfach gemäß den Standards und Spezifikationen
.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:
2.1. Bereiten Sie ein Maven-Projekt vor
Löschen Sie das src-Verzeichnis,
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 werden
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>
/** * @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; }
/** * @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); } }
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
1. 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); } }
Oss integrieren Wenn die Konfiguration korrekt geändert wird, kann sie verwendet werden~
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.nzc.CommonAutoConfig
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!