Analisis kod sumber Spring Cloud: Bahagian 1
Jangan ketawakan rakan yang membaca kod sumber Pada masa kini, temu bual hanya tentang esei lapan bahagian dan tidak boleh dipercayai. Saya tidak mempunyai pilihan selain membuat roda, jika tidak ia akan menjadi sangat memenatkan dan membosankan!
Secara peribadi, saya rasa prasyarat untuk membaca kod sumber adalah untuk dapat menggunakannya, anda boleh meneka bagaimana orang lain melaksanakannya. Jika ada dokumen rasmi yang berkaitan, kemudian baca dokumen rasmi.
Namun, sayangnya banyak dokumen rasmi yang ditulis dengan buruk sehingga membuatkan anda keliru selepas membacanya seketika.
Baru-baru ini saya sedang belajar 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">openfeign kod sumber Pada masa itu, saya menemui anotasi utama dalam kod sumber: @Import
. openfeign
源码的时候,发现在源码中有个关键注解:@Import
。
项目启动类:
/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @EnableFeignClients(basePackages = {"com.tian.feign"}) @SpringBootApplication() public class MqApplication { public static void main(String[] args) { SpringApplication.run(MqApplication.class, args); } }
然后,就是我们的feignclient
接口:
/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @FeignClient(contextId = "userFeignClient", value = "charge-user-service") public interface UserFeignClient { /** * 邀请成功增加收益 * * @param invitedDto 邀请增加收益 * @return 邀请成功 */ @PostMapping("/user/invited/register") CommonResult<Boolean> invitedRegister(@RequestBody InvitedDto invitedDto); }
使用案例:
/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @RestController @RequestMapping("/user") public class UserController { @Resource UserFeignClient userFeignClient; @PostMapping("/invited") public CommonResult invitedRegister(){ //省略不想搞的代码 return userFeignClient.invitedRegister(invitedDto); } }
从上面的代码中,我们可以看出openfeign
关键代码有:
@EnableFeignClients(basePackages = {"com.tian.feign"})
@FeignClient(contextId = "userFeignClient", value = "charge-user-service")
Kelas permulaan projek: 🎜
userFeignClient.invitedRegister(invitedDto);
🎜Kemudian, inilah/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { String[] value() default {}; String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] defaultConfiguration() default {}; Class<?>[] clients() default {}; }Salin selepas log masukSalin selepas log masukfeignclient
Antaramuka: 🎜🎜Kes penggunaan: 🎜@Import(FeignClientsRegistrar.class)Salin selepas log masukSalin selepas log masuk🎜Daripada kod di atas, kita dapat melihat bahawa/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { registerDefaultConfiguration(metadata, registry); registerFeignClients(metadata, registry); }Salin selepas log masukSalin selepas log masukopenfeign
Kod utama ialah: 🎜
@EnableFeignClients( basePackages = {"com.tian.feign"})
🎜
@FeignClient(contextId = "userFeignClient", value = " charge-user-service")
🎜
userFeignClient.invitedRegister(invitedDto);🎜 @
EnableFeignClients
@EnableFeignClients
这个注解在启动类上,我们肯定要重点关注。小技巧:凡是以
@Enable
开头的各种注解基本上都是开启xxxx
。比如:@EnableFeignClients
表示开启feign客户端。我们进入
@EnableFeignClients
中/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { String[] value() default {}; String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] defaultConfiguration() default {}; Class<?>[] clients() default {}; }Salin selepas log masukSalin selepas log masuk我们通常只需要关心属性
basePackages
,表示我们需要扫描的包目录。如果既没有指定
basePackages
,也没有指定basePackageClasses
,则采用启动类所在的目录作为包扫描路径。默认是这种情况。本文重点来了,在这个注解
@EnableFeignClients
上有个注解@Import(FeignClientsRegistrar.class)
,这里到底是有什么作用?
@Import() @Import()
@Import()
注解是在spring 3.0版本中引入的,字面意义就是导入.
@Import
注解的全类名是org.springframework.context.annotation.Import
。其只有一个默认的value属性,该属性类型为Class<?>[]
,表示可以传入一个或多个Class对象。通过注释可以看出,该注解有如下作用:
可以导入一个或多个组件类(通常是@Configuration配置类)该注解的功能与Spring XML中的
<import/>
元素相同。可以导入@Configuration
配置类、ImportSelect
和ImportBeanDefinitionRegistrar
的实现类。从spring 4.2版本开始,还可以引用常规组件类(普通类),该功能类似于
AnnotationConfigApplicationContext.register()
方法。该注解可以在类中声明,也可以在元注解中声明。如果需要导入XML或其他非
@Configuration
定义的资源,可以使用@ImportResource
🎜
@Import()
anotasi telah diperkenalkan pada musim bunga versi 3.0 dan makna literalnya ialah import.Nama kelas penuh anotasi @Import
ialahorg.springframework.context.annotation.Import
. Ia hanya mempunyai satu atribut nilai lalai, iaitu jenisClass< ;?>[]
, menunjukkan bahawa satu atau lebih objek Kelas boleh dihantar masuk. 🎜🎜Seperti yang dapat dilihat daripada anotasi, anotasi mempunyai fungsi berikut: 🎜🎜Anda boleh mengimport satu atau lebih kelas komponen (biasanya kelas konfigurasi @Configuration Fungsi anotasi ini adalah sama dengan<import/>
elemen adalah sama . Boleh mengimport@Configuration
Kelas konfigurasi,ImportSelect
danImportBeanDefinitionRegistrar
kelas pelaksanaan. 🎜🎜Bermula dari musim bunga 4.2, anda juga boleh merujuk kelas komponen biasa (kelas biasa) Fungsi ini serupa denganKaedah AnnotationConfigApplicationContext.register()
. 🎜🎜Anotasi ini boleh diisytiharkan dalam kelas atau dalam anotasi meta. Jika anda perlu mengimport XML atau lain-lain bukan- , 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96 );">@Configuration Untuk sumber yang ditentukan, anda boleh menggunakan@ImportResource
anotasi . 🎜🎜Biasanya ada tiga cara untuk menggunakannya: 🎜
@Import
一个普通类 spring会将该类加载到spring容器中@Import
一个类,该类实现了ImportBeanDefinitionRegistrar
接口,在重写的registerBeanDefinitions
方法里面,能拿到BeanDefinitionRegistry
的注册器,能手工往beanDefinitionMap
中注册beanDefinition
@Import
一个类 该类实现了ImportSelector
重写selectImports
方法该方法返回了String[]数组的对象,数组里面的类都会注入到spring容器当中。下面我们来聊聊
@Import
在openfeign的这里是起到什么作用。
openfeign
中作用回答上面的代码里
@Import(FeignClientsRegistrar.class)Salin selepas log masukSalin selepas log masuk这里导入的是
FeignClientsRegistrar
类,我们再来看看他的类关系图:
从类关系图来看,
FeignClientsRegistrar
实现了ImportBeanDefinitionRegistrar
接口。再结合@Import
的三种使用方式中的第二种方式,能手工往beanDefinitionMap
中注册beanDefinition
。/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月07日 16:47 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { registerDefaultConfiguration(metadata, registry); registerFeignClients(metadata, registry); }Salin selepas log masukSalin selepas log masuk这个方法
registerBeanDefinitions()
是feign的核心入口方法,其中会做两件事:注册默认的配置和注册所有的FeignClient。
registerDefaultConfiguration(metadata, registry)
这个方法是负责注册
OpenFeign
的默认配置 ,逻辑相对简单:private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { //获取@EnableFeignClients的全部属性 //@EnableFeignClients(basePackages = {"com.tian.feign"}) //这里的basePackages就是我们指定的熟悉 Map<String, Object> defaultAttrs = metadata .getAnnotationAttributes(EnableFeignClients.class.getName(), true); if (defaultAttrs != null && defaultAttrs.containsKey("defaultConfiguration")) { String name; if (metadata.hasEnclosingClass()) { name = "default." + metadata.getEnclosingClassName(); } else { name = "default." + metadata.getClassName(); } registerClientConfiguration(registry, name, defaultAttrs.get("defaultConfiguration")); } }Salin selepas log masuk
defaultAttrs
中内容如下:
但是这里我们只关注defaultConfiguration,我们并有对其进行设置,所以我们可以忽略他。重点是下面这个方法。
registerFeignClients(metadata, registry)
这里就是项目启动时和openfeign相关的核心代码,这也是
@EnableFeignClients
和@FeignClient
两个注解关联起来的地方。我们进入源码中:
public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { ClassPathScanningCandidateComponentProvider scanner = getScanner(); scanner.setResourceLoader(this.resourceLoader); Set<String> basePackages; Map<String, Object> attrs = metadata .getAnnotationAttributes(EnableFeignClients.class.getName()); AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter( FeignClient.class); final Class<?>[] clients = attrs == null ? null : (Class<?>[]) attrs.get("clients"); if (clients == null || clients.length == 0) { scanner.addIncludeFilter(annotationTypeFilter); basePackages = getBasePackages(metadata); } else { final Set<String> clientClasses = new HashSet<>(); basePackages = new HashSet<>(); for (Class<?> clazz : clients) { basePackages.add(ClassUtils.getPackageName(clazz)); clientClasses.add(clazz.getCanonicalName()); } AbstractClassTestingTypeFilter filter = new AbstractClassTestingTypeFilter() { @Override protected boolean match(ClassMetadata metadata) { String cleaned = metadata.getClassName().replaceAll("\\$", "."); return clientClasses.contains(cleaned); } }; scanner.addIncludeFilter( new AllTypeFilter(Arrays.asList(filter, annotationTypeFilter))); } for (String basePackage : basePackages) { Set<BeanDefinition> candidateComponents = scanner .findCandidateComponents(basePackage); for (BeanDefinition candidateComponent : candidateComponents) { if (candidateComponent instanceof AnnotatedBeanDefinition) { // verify annotated class is an interface AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent; AnnotationMetadata annotationMetadata = beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface"); Map<String, Object> attributes = annotationMetadata .getAnnotationAttributes( FeignClient.class.getCanonicalName()); String name = getClientName(attributes); registerClientConfiguration(registry, name, attributes.get("configuration")); registerFeignClient(registry, annotationMetadata, attributes); } } } }Salin selepas log masuk代码一行一行看是不是觉得很累,我给你总结好了。
上面的方法分为以下七个步骤:
Mula-mula dapatkan @EnableFeignClients
beranotasi Semua atribut, terutamanya untuk mendapatkan laluan pakej imbasan (basePackages); <code style='font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>@EnableFeignClients
注解的所有属性,主要为了拿到扫描包路径(basePackages
);因为一般不会在 @EnableFeignClients
注解中配置clients属性,所以会进入到clients属性为空时的逻辑;然后通过 getScanner()
方法获取扫描器:ClassPathScanningCandidateComponentProvider
,并将上下文AnnotationConfigServletWebServerApplicationContext
作为扫描器的ResourceLoader
;接着给扫描器 ClassPathScanningCandidateComponentProvider
添加一个注解过滤器(AnnotationTypeFilter),只过滤出包含@FeignClient
注解的BeanDefinition
;- 🎜 kerana ia biasanya tidak digunakan dalam
再通过 getBasePackages(metadata)
方法获取@EnableFeingClients
@EnableFeignClients
konfigurasikan atribut klien dalam anotasi, jadi ia akan memasuki logik apabila atribut klien kosong; 🎜🎜🎜🎜 Kemudian hantargetScanner()
kaedah mendapat pengimbas:ClassPathScanningCandidateComponentProvider
dan konteksAnnotationConfigServletWebServerApplicationContext
Sebagai pengimbasResourceLoader
;🎜🎜🎜🎜Kemudian berikan pengimbasClassPathScanningCandidateComponentProvider
Tambah penapis anotasi (AnnotationTypeFilter) untuk hanya menapis fail yang mengandungi@FeignClient
anotasiBeanDefinition
; 🎜🎜🎜🎜 dan kemudian lulusgetBasePackages(metadata)
kaedah memperolehLaluan imbasan pakej atau kelas imbasan yang dinyatakan dalam anotasi @EnableFeingClients
; jika tidak diperolehi, laluan pakej di mana kelas permulaan terletak akan diimbas secara lalai; 🎜🎜Kemudian masukkan logik teras: pas scanner.findCandidateComponents( basePackage)
kaedah mengimbas semua anotasi daripada laluan pakej@FeignClient
Antara muka beranotasi dan layak untuk pemasangan;scanner.findCandidateComponents(basePackage)
方法从包路径下扫描出所有标注了@FeignClient
注解并符合条件装配的接口;
FeignClientConfiguration
在BeanDefinitionRegistry
中注册一下,再对FeignClient
做真正的注册操作。总结
在openfeign
源码中的@Import注解在这里的作用就是将扫描到带有FeignClient
FeignClientConfiguration
dalam Daftarkannya dalam BeanDefinitionRegistry
, dan kemudian FeignClient
melakukan operasi pendaftaran sebenar. Ringkasan
Dalamopenfeign
Anotasi @Import dalam kod sumber digunakan di sini untuk mengimbas fail dengan FeignClient
Semua kelas antara muka yang diberi anotasi didaftarkan dalam bentuk kacang dalam bekas IOC spring.
@Import
Spring kelas biasa Kelas ini akan dimuatkan ke dalam bekas spring@Import
一个普通类 spring会将该类加载到spring容器中@Import
一个类,该类实现了ImportBeanDefinitionRegistrar
接口,在重写的registerBeanDefinitions
方法里面,能拿到BeanDefinitionRegistry
的注册器,能手工往beanDefinitionMap
中注册beanDefinition
@Import
一个类 该类实现了ImportSelector
重写selectImports
@Import
Kelas yang melaksanakan ImportBeanDefinitionRegistrar kod> antara muka, dalam <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba (27, 31) , 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>registerBeanDefinitionsIn kaedahnya, anda boleh mendapatkan <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27 , 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>BeanDefinitionRegistry
register, anda boleh menetapkan secara manual beanDefinitionMap
DaftarAtas ialah kandungan terperinci Analisis kod sumber Spring Cloud: Bahagian 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Memandangkan kerumitan aplikasi perusahaan terus meningkat, semakin banyak perusahaan mula membahagikan aplikasi kepada berbilang perkhidmatan mikro dan melengkapkan keseluruhan proses perniagaan melalui kerjasama antara perkhidmatan mikro. Pendekatan seni bina ini boleh menjadikan aplikasi lebih stabil dan berskala, tetapi ia juga membawa beberapa masalah baharu, seperti pengimbangan beban, penemuan perkhidmatan, dsb. Artikel ini akan memperkenalkan cara menggunakan Spring Cloud untuk menyelesaikan masalah pengimbangan beban di bawah seni bina perkhidmatan mikro. Apakah pengimbangan beban? Pengimbangan Beban (LoadBalancing) merujuk kepada pengimbangan berbilang pelayan dan rangkaian

Secara peribadi, saya fikir prasyarat untuk membaca kod sumber ialah anda mesti boleh menggunakannya Setelah anda biasa dengannya, anda boleh meneka bagaimana orang lain melaksanakannya. Jika terdapat dokumen rasmi yang berkaitan, kemudian baca dokumen rasmi.

Dengan pembangunan Internet dan pengemaskinian berterusan teknologi, aplikasi tunggal tradisional tidak lagi dapat memenuhi keperluan pengguna, dan konsep perkhidmatan mikro telah muncul. SpringCloud ialah kit pembangunan perkhidmatan mikro yang dilancarkan oleh Pivotal Ia menyediakan pembangun cara yang sangat mudah untuk membina, menggunakan dan mengurus aplikasi seni bina perkhidmatan mikro. Artikel ini akan memperkenalkan pembangunan perkhidmatan mikro SpringCloud berorientasikan perkhidmatan secara terperinci, termasuk konsep dan seni bina SpringCloud, proses pembangunan perkhidmatan mikro dan

Cara menggunakan Java untuk membangunkan aplikasi orkestrasi kontena berdasarkan Spring Cloud Kubernetes Dengan pembangunan dan aplikasi meluas teknologi kontena, alat orkestrasi kontena telah menjadi bahagian yang amat diperlukan dalam pembangun. Sebagai salah satu alat orkestrasi kontena yang paling popular, Kubernetes telah menjadi standard industri. Dalam konteks ini, menggabungkan Spring Cloud dan Kubernetes, kami boleh membangunkan aplikasi dengan mudah berdasarkan orkestrasi kontena. Artikel ini akan memperkenalkan secara terperinci

Dengan perkembangan pesat Internet, kerumitan aplikasi peringkat perusahaan semakin meningkat dari hari ke hari. Sebagai tindak balas kepada keadaan ini, seni bina perkhidmatan mikro muncul. Dengan modularitinya, penggunaan bebas dan kebolehskalaan yang tinggi, ia telah menjadi pilihan pertama untuk pembangunan aplikasi peringkat perusahaan hari ini. Sebagai seni bina perkhidmatan mikro yang cemerlang, Spring Cloud telah menunjukkan kelebihan besar dalam aplikasi praktikal. Artikel ini akan memperkenalkan penggunaan dan pengendalian serta penyelenggaraan seni bina perkhidmatan mikro SpringCloud. 1. Gunakan seni bina perkhidmatan mikro SpringCloud SpringCloud

Pengenalan kepada rangka kerja SpringCloud dalam bahasa Java Dengan populariti pengkomputeran awan dan perkhidmatan mikro, rangka kerja SpringCloud telah menjadi salah satu rangka kerja pilihan untuk membina aplikasi asli awan dalam bahasa Java. Artikel ini akan memperkenalkan konsep dan ciri rangka kerja Spring Cloud dan cara menggunakan Spring Cloud untuk membina seni bina perkhidmatan mikro. Pengenalan kepada SpringCloud Rangka kerja SpringCloud ialah rangka kerja mikro perkhidmatan berdasarkan SpringBoot. ia adalah

Dengan populariti seni bina perkhidmatan mikro, semakin banyak pasukan pembangunan perusahaan mula menggunakan Spring Cloud untuk membina sistem perkhidmatan mikro mereka sendiri. Dalam persekitaran teragih, melaksanakan kunci teragih ialah cabaran teknikal yang penting. Artikel ini akan memperkenalkan cara melaksanakan amalan mikroperkhidmatan kunci teragih di bawah rangka kerja Awan Musim Bunga. Pertama, kita perlu memahami apa itu kunci yang diedarkan. Kunci teragih ialah teknologi yang digunakan untuk melindungi akses kepada sumber yang dikongsi Ia boleh memastikan bahawa dalam persekitaran yang diedarkan, berbilang nod tidak akan mengubah suai sumber yang sama pada masa yang sama atau

Dengan pembangunan berterusan teknologi Internet, semakin banyak perusahaan mula menggunakan seni bina perkhidmatan mikro untuk membina sistem mereka. SpringCloud ialah rangka kerja perkhidmatan mikro yang telah muncul dengan pantas dalam konteks ini. Atas dasar ini, artikel ini akan membincangkan gabungan perkhidmatan mikro SpringCloud dan komponenisasi, dan menganalisis kelebihan dan kaedah pelaksanaannya. 1. Pengenalan kepada perkhidmatan mikro SpringCloud SpringCloud ialah versi projek SpringBoot yang dinaik taraf Ia menyediakan sejumlah besar alatan.
