Spring RestTemplate 消息转换2种使用方式

拦截器

public class MyXmlInterceptor implements ClientHttpRequestInterceptor {

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    ClientHttpResponse response = execution.execute(request, body);
    HttpHeaders headers = response.getHeaders();

    // you'd want to check if the value needs to be changed
    if (headers.containsKey("Content-Type")) {
        headers.remove("Content-Type");
    }

    headers.add("Content-Type", "application/xml");

    return response;
}
RestTemplate t = new RestTemplate();
t.getInterceptors().add(new MyXmlInterceptor());

自定义

RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.TEXT_HTML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jaxbMessageConverter);
restTemplate.setMessageConverters(messageConverters);

Spring Bean 循环依赖

容器中有两个ConcurrentHashMap 用于解决循环依赖问题,ObjectHashMap和FactoryHashMap,分别用于存放完美的和不完美的对象。

Spring一扫描,发现AService中需要一个BService。

然后就开始找,ObjectHashMap中有没有完美的BService啊?有就直接用,没有接着去FactoryHashMap中找。如果有就用,虽然不完美,起码比没有好。

如果这两个里面都没有,那就没招了,再去new一个吧。

先创建AService,其构造函数中需要BService,然后又去创建BService。

发现在BService的构造函数中又需要AService,又去创建AService,因为当前正在创建Aervice,再去创建就会报异常:BeanCurrentlyInCreationException。

对于默认的单例Bean,可以通过上面的缓存方式解决循环依赖。Spring容器是不会对多例的Bean进行缓存的,所以多例Bean也是不能循环依赖的。

最佳实践:
1.最好将Autowired注解标注在属性上。
2.构造函数方式与多例Bean是不能解决循环依赖的问题的。