feign的作用及在基于spring cloud的开发体系里的重要性就不再提了,想必java行业内的大伙都明白。
首先,先创建一个简单的项目。
demo的结构如下图所示
pom文件仅截取部分如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
代码按DemoApplication,DemoService,DemoController如下
//DemoApplication
@SpringBootApplication
@EnableFeignClients
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
//DemoService
@Component
@FeignClient(value = "remote-service")
public interface DemoService {
@GetMapping("/info/{id}")
String getInfo(@PathVariable Long id);
}
//DemoController
@RestController
@RequestMapping("/demo")
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("/info/{id}")
public void getInfo(final Long id){
final String info = demoService.getInfo(id);
System.out.println(info);
}
}
第二步,分析@EnableFeignClients 注解,了解项目启动时Feign完成的事
我们应当知道,springboot集成其他组件,都是从@EnableXXX注解开始的,此处我们关心的是其@Import里的类FeignClientsRegistrar,其实现了ImportBeanDefinitionRegistrar,可用于注册BeanDefinition。
其中最重要的方法实现
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
registerDefaultConfiguration(metadata, registry);
registerFeignClients(metadata, registry);
}
从里面的方法名可以看出这是分为了两步。第一是注册Feign配置,第二是注册Feign客户端。
从上面代码可以看出我们没有在@EnableFeignClients注解上添加任何东西,所以所有的都是默认的。
接着我们看看是如何注册Feign客户端的
public void regis