Skip to content

Commit d71cffd

Browse files
Merge pull request #39 from LianjiaTech/develop
RetrofitClient接口自动注册
2 parents c27988c + 6737ae5 commit d71cffd

File tree

8 files changed

+107
-42
lines changed

8 files changed

+107
-42
lines changed

README.md

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,10 @@
4242
<dependency>
4343
<groupId>com.github.lianjiatech</groupId>
4444
<artifactId>retrofit-spring-boot-starter</artifactId>
45-
<version>2.2.0</version>
45+
<version>2.2.1</version>
4646
</dependency>
4747
```
4848

49-
### 配置`@RetrofitScan`注解
50-
51-
你可以给带有 `@Configuration` 的类配置`@RetrofitScan`,或者直接配置到`spring-boot`的启动类上,如下:
52-
53-
```java
54-
@SpringBootApplication
55-
@RetrofitScan("com.github.lianjiatech.retrofit.spring.boot.test")
56-
public class RetrofitTestApplication {
57-
58-
public static void main(String[] args) {
59-
SpringApplication.run(RetrofitTestApplication.class, args);
60-
}
61-
}
62-
```
63-
6449
### 定义http接口
6550

6651
**接口必须使用`@RetrofitClient`注解标记**!http相关注解可参考官方文档:[retrofit官方文档](https://square.github.io/retrofit/)
@@ -93,6 +78,9 @@ public class TestService {
9378
}
9479
```
9580

81+
**默认情况下,自动使用`SpringBoot`扫描路径进行`retrofitClient`注册**。你也可以在配置类加上`@RetrofitScan`手工指定扫描路径。
82+
83+
9684
## HTTP请求相关注解
9785

9886
`HTTP`请求相关注解,全部使用了`retrofit`原生注解。**详细信息可参考官方文档:[retrofit官方文档](https://square.github.io/retrofit/)**,以下是一个简单说明。

README_EN.md

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,10 @@
4343
<dependency>
4444
<groupId>com.github.lianjiatech</groupId>
4545
<artifactId>retrofit-spring-boot-starter</artifactId>
46-
<version>2.2.0</version>
46+
<version>2.2.1</version>
4747
</dependency>
4848
```
4949

50-
### Configure `@RetrofitScan` annotation
51-
52-
You can configure `@Configuration` for the class with `@RetrofitScan` or directly configure it to the startup class of `spring-boot`, as follows:
53-
54-
```java
55-
@SpringBootApplication
56-
@RetrofitScan("com.github.lianjiatech.retrofit.spring.boot.test")
57-
public class RetrofitTestApplication {
58-
59-
public static void main(String[] args) {
60-
SpringApplication.run(RetrofitTestApplication.class, args);
61-
}
62-
}
63-
```
64-
6550
### Define HTTP interface
6651

6752
**The interface must be marked with `@RetrofitClient` annotation**! Related annotations of HTTP can refer to the official documents: [Retrofit official documents](https://square.github.io/retrofit/).
@@ -92,6 +77,8 @@ public class TestService {
9277
}
9378
```
9479

80+
**By default, the SpringBoot scan path is automatically used for retrofitClient registration**. You can also add `@RetrofitScan` to the configuration class to manually specify the scan path.
81+
9582
## Related annotations of HTTP request
9683

9784
All of the related annotations of `HTTP` request use native annotations of `retrofit`. **For more information, please refer to the official document: [Retrofit official documents](https://square.github.io/retrofit/)**. The following is a brief description:

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.github.lianjiatech</groupId>
88
<artifactId>retrofit-spring-boot-starter</artifactId>
9-
<version>2.2.0</version>
9+
<version>2.2.1</version>
1010

1111
<name>retrofit-spring-boot-starter</name>
1212
<description>retrofit-spring-boot-starter</description>

src/main/java/com/github/lianjiatech/retrofit/spring/boot/annotation/RetrofitScan.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.github.lianjiatech.retrofit.spring.boot.annotation;
22

3-
import com.github.lianjiatech.retrofit.spring.boot.core.RetrofitClientRegistrar;
3+
import com.github.lianjiatech.retrofit.spring.boot.core.RetrofitClientScannerRegistrar;
44
import org.springframework.context.annotation.Import;
55

66
import java.lang.annotation.*;
@@ -11,7 +11,7 @@
1111
@Retention(RetentionPolicy.RUNTIME)
1212
@Target(ElementType.TYPE)
1313
@Documented
14-
@Import(RetrofitClientRegistrar.class)
14+
@Import(RetrofitClientScannerRegistrar.class)
1515
public @interface RetrofitScan {
1616

1717
/**

src/main/java/com/github/lianjiatech/retrofit/spring/boot/config/RetrofitAutoConfiguration.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import com.fasterxml.jackson.annotation.JsonInclude;
44
import com.fasterxml.jackson.databind.DeserializationFeature;
55
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.github.lianjiatech.retrofit.spring.boot.core.NoValidServiceInstanceChooser;
7-
import com.github.lianjiatech.retrofit.spring.boot.core.PrototypeInterceptorBdfProcessor;
8-
import com.github.lianjiatech.retrofit.spring.boot.core.ServiceInstanceChooser;
6+
import com.github.lianjiatech.retrofit.spring.boot.core.*;
97
import com.github.lianjiatech.retrofit.spring.boot.degrade.BaseResourceNameParser;
108
import com.github.lianjiatech.retrofit.spring.boot.degrade.RetrofitDegradeRuleInitializer;
119
import com.github.lianjiatech.retrofit.spring.boot.interceptor.BaseGlobalInterceptor;
@@ -17,6 +15,7 @@
1715
import org.slf4j.Logger;
1816
import org.slf4j.LoggerFactory;
1917
import org.springframework.beans.BeansException;
18+
import org.springframework.beans.factory.InitializingBean;
2019
import org.springframework.beans.factory.annotation.Autowired;
2120
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2221
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -26,6 +25,7 @@
2625
import org.springframework.context.ApplicationContextAware;
2726
import org.springframework.context.annotation.Bean;
2827
import org.springframework.context.annotation.Configuration;
28+
import org.springframework.context.annotation.Import;
2929
import retrofit2.CallAdapter;
3030
import retrofit2.Converter;
3131
import retrofit2.converter.jackson.JacksonConverterFactory;
@@ -43,7 +43,7 @@
4343
@AutoConfigureAfter({JacksonAutoConfiguration.class})
4444
public class RetrofitAutoConfiguration implements ApplicationContextAware {
4545

46-
private final static Logger logger = LoggerFactory.getLogger(RetrofitAutoConfiguration.class);
46+
private static final Logger logger = LoggerFactory.getLogger(RetrofitAutoConfiguration.class);
4747

4848
@Autowired
4949
private RetrofitProperties retrofitProperties;
@@ -139,4 +139,15 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
139139
public RetrofitDegradeRuleInitializer retrofitDegradeRuleInitializer() {
140140
return new RetrofitDegradeRuleInitializer(retrofitProperties);
141141
}
142+
143+
@Configuration
144+
@Import({AutoConfiguredRetrofitScannerRegistrar.class})
145+
@ConditionalOnMissingBean(RetrofitFactoryBean.class)
146+
public static class RetrofitScannerRegistrarNotFoundConfiguration implements InitializingBean {
147+
@Override
148+
public void afterPropertiesSet() {
149+
logger.debug("No {} found.", RetrofitFactoryBean.class.getName());
150+
}
151+
}
152+
142153
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.github.lianjiatech.retrofit.spring.boot.core;
2+
3+
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.beans.BeansException;
7+
import org.springframework.beans.factory.BeanClassLoaderAware;
8+
import org.springframework.beans.factory.BeanFactory;
9+
import org.springframework.beans.factory.BeanFactoryAware;
10+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
11+
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
12+
import org.springframework.context.ResourceLoaderAware;
13+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
14+
import org.springframework.core.io.ResourceLoader;
15+
import org.springframework.core.type.AnnotationMetadata;
16+
17+
import java.util.List;
18+
19+
/**
20+
* This will just scan the same base package as Spring Boot does. If you want more power, you can explicitly use
21+
* {@link com.github.lianjiatech.retrofit.spring.boot.annotation.RetrofitScan} but this will get typed mappers working correctly, out-of-the-box,
22+
* similar to using Spring Data JPA repositories.
23+
*
24+
* @author 陈添明
25+
*/
26+
public class AutoConfiguredRetrofitScannerRegistrar implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware {
27+
28+
private static final Logger logger = LoggerFactory.getLogger(AutoConfiguredRetrofitScannerRegistrar.class);
29+
30+
private BeanFactory beanFactory;
31+
32+
private ResourceLoader resourceLoader;
33+
34+
private ClassLoader classLoader;
35+
36+
@Override
37+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
38+
this.beanFactory = beanFactory;
39+
}
40+
41+
42+
@Override
43+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
44+
if (!AutoConfigurationPackages.has(this.beanFactory)) {
45+
logger.debug("Could not determine auto-configuration package, automatic retrofit scanning disabled.");
46+
return;
47+
}
48+
49+
logger.debug("Searching for retrofits annotated with @RetrofitClient");
50+
51+
List<String> packages = AutoConfigurationPackages.get(this.beanFactory);
52+
if (logger.isDebugEnabled()) {
53+
packages.forEach(pkg -> logger.debug("Using auto-configuration base package '{}'", pkg));
54+
}
55+
56+
// Scan the @RetrofitClient annotated interface under the specified path and register it to the BeanDefinitionRegistry
57+
ClassPathRetrofitClientScanner scanner = new ClassPathRetrofitClientScanner(registry, classLoader);
58+
if (resourceLoader != null) {
59+
scanner.setResourceLoader(resourceLoader);
60+
}
61+
String[] packageArr = packages.toArray(new String[0]);
62+
scanner.registerFilters();
63+
// Scan and register to BeanDefinition
64+
scanner.doScan(packageArr);
65+
}
66+
67+
68+
@Override
69+
public void setResourceLoader(ResourceLoader resourceLoader) {
70+
this.resourceLoader = resourceLoader;
71+
}
72+
73+
74+
@Override
75+
public void setBeanClassLoader(ClassLoader classLoader) {
76+
this.classLoader = classLoader;
77+
}
78+
}

src/main/java/com/github/lianjiatech/retrofit/spring/boot/core/RetrofitClientRegistrar.java renamed to src/main/java/com/github/lianjiatech/retrofit/spring/boot/core/RetrofitClientScannerRegistrar.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
/**
2020
* @author 陈添明
2121
*/
22-
public class RetrofitClientRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware {
22+
public class RetrofitClientScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware {
2323

2424
private ResourceLoader resourceLoader;
2525

@@ -29,6 +29,9 @@ public class RetrofitClientRegistrar implements ImportBeanDefinitionRegistrar, R
2929
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
3030
AnnotationAttributes attributes = AnnotationAttributes
3131
.fromMap(metadata.getAnnotationAttributes(RetrofitScan.class.getName()));
32+
if (attributes == null) {
33+
return;
34+
}
3235
// Scan the @RetrofitClient annotated interface under the specified path and register it to the BeanDefinitionRegistry
3336
ClassPathRetrofitClientScanner scanner = new ClassPathRetrofitClientScanner(registry, classLoader);
3437
if (resourceLoader != null) {

src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/RetrofitTestApplication.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.github.lianjiatech.retrofit.spring.boot.test;
22

3-
import com.github.lianjiatech.retrofit.spring.boot.annotation.RetrofitScan;
43
import org.springframework.boot.SpringApplication;
54
import org.springframework.boot.autoconfigure.SpringBootApplication;
65
import org.springframework.context.annotation.Bean;
@@ -11,7 +10,6 @@
1110
* @author 陈添明
1211
*/
1312
@SpringBootApplication
14-
@RetrofitScan("com.github.lianjiatech.retrofit.spring.boot.test")
1513
public class RetrofitTestApplication {
1614

1715
public static void main(String[] args) {

0 commit comments

Comments
 (0)