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.
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
Padam direktori src,
dan kemudian buat dua projek Maven (saya secara peribadi. Kebiasaan, biasa membuat projek Maven kosong, sebenarnya mencipta projek SpringBoot adalah sama)
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>
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; }
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); } }
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.nzc.CommonAutoConfig
Jika terdapat berbilang fail: .
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.nzc.CommonAutoConfig \ com.xxx.xxxSelepas mencapai langkah ini, kami akan mencipta pakej Jar untuk projek ini, dan kemudian memperkenalkannya dalam projek yang akan digunakan. 2.6. Pengujian Aplikasi
spring: application: name: app-server nzc: sms: name: ningzaichun oss: accessKey: xxx secret: xxx endpoint: oss-cn-shenzhen.aliyuncs.com bucketName: xxx url: xxxAnda 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~
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!