bean的详解

IOC操作bean管理
Spring创建对象,Spring注入属性

Bean管理操作两种方式
一.基于xml配置文件方式的实现

<bean id="user" class="<!--工程名-->"></bean>

1.在spring配置文件中,使用bean标签,标签里面添加对应的属性,就可以实现对象创建
2.常用属性:
id属性:唯一标识
class属性:类全路径
3.创建对象的时候,默认也是执行无参数构造方法完成对象的创建
4.基于xml的对象属性注入
set方法注入属性
在这里插入图片描述
有参数构造注入属性
在这里插入图片描述

在这里插入图片描述
xml注入其他类型的属性
在这里插入图片描述
外部注入
在这里插入图片描述

在这里插入图片描述
内部注入
在这里插入图片描述
注入数组类型属性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注入集合类型为引用对象的方法
在这里插入图片描述
Spring有两种类型的bean,一种是普通的bean,另一种是工厂bean
普通bean:在配置文件中定义bean类型就是返回类型
工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean

在这里插入图片描述

第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
在这里插入图片描述
Bean的作用域
singleton:单例,指一个Bean容器中只存在一份
prototype:每次请求创建新的实例,destory方式不生效
request:每次http请求创建一个实例且仅在当前request内有效
session:同上,每次http请求创建,当前session内有效
global session: 基于portlet的web中有效(portlet定义了global session),如果是在web中,同session

bean生命周期

1.通过构造器创建bean实例
2.为bean的属性设置值和对其他bean引用
3.调用bean的初始化的方法(需要进行设置)
在这里插入图片描述

4.使用bean
5.让容器关闭的时候,调用bean 的销毁的方法(需要进行设置)
在这里插入图片描述
xml的自动装配
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
Bean的自动装配
NO:不做任何操作
byName:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么就会抛出异常;如果没有找到相匹配的bean,则什么事都不会发生
Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

二.基于注解方式实现
1.@Component
在这里插入图片描述

value值与class类名一致
2.@Service
3.@Controller
4.@Repository
5.@AutoWired:根据属性类型进行自动装配
第一步把service和dao对象创建,在service和dao类添加创建对象注解
第二步在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解

6.@Qualifier 根据属性名称进行注入
7.@Resource可以根据类型注入,也可以根据名称注入
在这里插入图片描述

8.@Value注入普通类型属性
完全注解开发
1.创建配置类,添加注解@Configuration,代替xml配置文件,添加注解componentScan,扫描组件
在这里插入图片描述
2.加载配置类
在这里插入图片描述

开启组件扫描:
1.如果扫描多个包,多个包使用逗号隔开
2.扫描包上层目录
在这里插入图片描述

Aware
Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源
通过Aware接口,可以对Spring相应资源进行操作
为对Spring进行简单的扩展提供了方便的入口

Resources
针对资源文件的统一接口
UrlResource:URL对应的资源,根据一个URL地址即可构建
ClassPathResource:获取类路径下的资源文件
FileSystemResource:获取文件系统里面的资源
ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源
InputStreamResource:针对于输入流封装的资源
ByteArrayResource:针对于字节数组封装的资源

<think>我们正在讨论Spring中RestTemplate的配置和使用。根据引用内容,RestTemplate是Spring提供的用于进行HTTP请求的客户端工具。在Spring Boot 1.4及之后的版本中,Spring Boot不再自动配置RestTemplate,而是提供了RestTemplateBuilder,以便更灵活地构建RestTemplate实例。因此,我们需要在配置类中显式定义RestTemplate Bean。 以下步骤将指导你如何配置和使用RestTemplate: ### 1. 添加依赖 首先,确保你的Spring Boot项目中已经添加了Web相关的依赖。在Maven项目中,你需要在`pom.xml`中添加: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` ### 2. 创建配置类 在配置类中,我们通过`@Bean`注解来创建RestTemplate的实例。有两种方式: - 直接返回`new RestTemplate()`:适用于简单场景。 - 使用`RestTemplateBuilder`:可以更灵活地配置,例如设置连接超时、消息转换器等。 #### 方式一:简单配置 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ``` #### 方式二:使用RestTemplateBuilder进行高级配置 ```java import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .setConnectTimeout(Duration.ofSeconds(5000)) // 连接超时时间 .setReadTimeout(Duration.ofSeconds(5000)) // 读取超时时间 .build(); } } ``` ### 3. 在服务中使用RestTemplate 在需要的地方,你可以通过自动注入的方式使用RestTemplate。例如,在一个Service类中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class MyService { private final RestTemplate restTemplate; @Autowired public MyService(RestTemplate restTemplate) { this.restTemplate = restTemplate; } public String getDataFromRemote() { String url = "https://api.example.com/data"; return restTemplate.getForObject(url, String.class); } } ``` ### 4. 高级配置 如果需要更复杂的配置,比如添加拦截器、设置错误处理器等,可以通过`RestTemplateBuilder`来实现。例如,添加一个自定义的拦截器来记录请求日志: ```java @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .additionalInterceptors(new LoggingInterceptor()) .build(); } ``` 其中,`LoggingInterceptor`需要实现`ClientHttpRequestInterceptor`接口。 ### 5. 异常处理 RestTemplate在遇到HTTP错误状态码(如4xx, 5xx)时,默认会抛出`HttpClientErrorException`或`HttpServerErrorException`。你可以通过编写异常处理器来捕获这些异常。 ### 注意事项 - RestTemplate在Spring 5.0以后进入了维护模式,官方推荐使用新的WebClient(支持响应式编程)。但在非响应式应用中,RestTemplate仍然是一个可靠的选择。 - 对于复杂的REST调用,你可以使用`exchange`方法,它提供了更灵活的参数设置。 - 确保你配置的RestTemplate Bean是单例的,因为创建多个实例可能会消耗过多的资源。 以上就是在Spring中配置和使用RestTemplate Bean的详细步骤。根据你的需求,可以选择简单配置或使用RestTemplateBuilder进行高级定制[^1][^2][^3][^4]。 §§相关问题§§ 1. RestTemplate和WebClient有什么区别? 2. 如何为RestTemplate添加请求拦截器? 3. RestTemplate如何支持HTTPS请求? 4. 如何处理RestTemplate的异常?</think>### Spring RestTemplate Bean 配置与使用详解 #### 1. 基础配置 在 Spring Boot 1.4+ 版本中,需显式配置 RestTemplate Bean: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); // 基础配置 } } ``` > 引用说明:Spring Boot 1.4+ 不再自动配置 RestTemplate,需手动定义 Bean[^1] #### 2. 高级配置(使用 RestTemplateBuilder) ```java @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .setConnectTimeout(Duration.ofSeconds(5)) // 连接超时 .setReadTimeout(Duration.ofSeconds(10)) // 读取超时 .defaultHeader("Authorization", "Bearer token") // 默认请求头 .build(); } ``` 优势: - 支持连接池配置 - 可添加拦截器 - 支持错误处理器 - 可自定义消息转换器[^4] #### 3. 核心使用方法 在服务类中注入使用: ```java @Service public class ApiService { @Autowired private RestTemplate restTemplate; // GET请求 public User getUser(String url) { return restTemplate.getForObject(url, User.class); } // POST请求 public ResponseEntity<String> createUser(User user) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<User> request = new HttpEntity<>(user, headers); return restTemplate.postForEntity("/users", request, String.class); } // PUT请求 public void updateUser(String url, User user) { restTemplate.put(url, user); } // DELETE请求 public void deleteUser(String url) { restTemplate.delete(url); } } ``` #### 4. 关键特性配置 **4.1 添加拦截器** ```java @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .additionalInterceptors(new LoggingInterceptor()) // 日志拦截器 .build(); } // 自定义拦截器 public class LoggingInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) { logRequest(request, body); ClientHttpResponse response = execution.execute(request, body); logResponse(response); return response; } } ``` **4.2 错误处理** ```java @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new CustomErrorHandler()); return restTemplate; } // 自定义错误处理器 public class CustomErrorHandler implements ResponseErrorHandler { @Override public boolean hasError(ClientHttpResponse response) { return response.getStatusCode().isError(); } @Override public void handleError(ClientHttpResponse response) { // 自定义异常处理逻辑 } } ``` **4.3 HTTPS支持** ```java @Bean public RestTemplate restTemplate() throws Exception { SSLContext sslContext = SSLContextBuilder .create() .loadTrustMaterial(null, (chain, authType) -> true) // 信任所有证书 .build(); HttpClient client = HttpClients.custom() .setSSLContext(sslContext) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(client)); } ``` #### 5. 最佳实践 1. **连接池配置**:使用 `PoolingHttpClientConnectionManager` 提升性能 2. **重试机制**:集成 Spring Retry 实现自动重试 3. **超时设置**:生产环境必须配置超时(连接/读取) 4. **异常处理**:统一处理 `RestClientException` 异常 5. **编解码器**:添加 Jackson 等消息转换器处理 JSON[^4] #### 6. 与 Hystrix 整合(熔断) ```java @HystrixCommand(fallbackMethod = "fallbackGetUser") public User getUserWithFallback(String url) { return restTemplate.getForObject(url, User.class); } private User fallbackGetUser(String url) { return new User("fallback", 0); // 降级数据 } ``` > 注意事项: > - RestTemplate 在 Spring 5 后进入维护模式,推荐使用 WebClient 响应式客户端 > - 避免在循环中创建 RestTemplate 实例 > - 使用 URI 模板参数代替字符串拼接 URL[^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值