AutoWire可以注入列表和字典

目前我们业务代码里有一种常见的模式,定义一个接口,接着通过多个handler类实现这个接口, 在面对不同的情况时通过调用不同的handler类来处理业务代码,通常这些handler类都会继承一个公用的父类,父类中会有一些公共的方法。 本文不讨论这种模式的合理性,单纯从技术角度分析实现的方案。因为在Java生态下,都是使用spring框架。所以之前的业务代码中都会把这些handler做成bean,而如何使用这些bean,实现方案千奇百怪。有交给spring ioc容器管理后,自行从context中根据bean name获取的。也有手动注入到一个大map中的。 其实官方文档里指出里Autowired注解是可以自动注入map和list的,这句话有点奇怪,我还是直接show code吧。 我使用的java版本是 openjdk 21.0.2 2024-01-16 OpenJDK Runtime Environment (build 21.0.2+13-58) OpenJDK 64-Bit Server VM (build 21.0.2+13-58, mixed mode, sharing) 对于使用spring的ioc容器和bean而言,只需要spring-context依赖即可。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.4</version> </dependency> 首先我们定义一个接口IMan和它的两个字类Teacher和Student, 为了方便我们不加入额外的逻辑和属性 public interface IMan {} public class Teacher implements IMan{} public class Student implements IMan{} 我们在实现一个ClassRoom类,该类使用@AutoWried注解注入一个元素类型为IMan的list和一个key为String, Value类型为IMan的map public class ClassRoom { @Autowired IMan[] people; @Autowired Map<String, IMan> categories; } 同时,使用xml配置自动装配和相关的bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www....

February 23, 2024 · 1 min

使用Spring自动注入时必须使用构造函数注入方式!

https://docs.spring.io/spring-framework/docs/5.3.25/reference/html/core.html#spring-core The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null. Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should 技术角度上说,依赖注入可以有field注入,setter注入方式和构造函数注入方式。技术角度上看,构造函数的优势在于保证返回的bean是完整的,且bean中依赖的其他类不为空。 然而在实际生产过程中,spring官方给的技术优势大部分开发并不关注,还是直接写一个域然后标一个autowired。...

September 19, 2023 · 1 min

RestTemplate使用

初始化 RestTemplate未来是要被弃用的,现在推荐使用webclient。 如果轻度使用,直接new一个RestTemplate就可以。 最小引用包是spring-web,如果引入spring-boot-starter-web这种很重的包会顺带启动tomcat。 在service中自动注入RestTemple restTemple. 自动注入需要先实力化,可以在启动类中(spring的各种初始化没认真看,得找个时间细学一下) @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } 使用 post MultiValueMap<String,String> params = new LinkedMultiValueMap<>(); params.add("key","value"); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("url"); URI uri = builder.build().encode().toUri(); ResponseEntity<MyClass> response = restTemplate.postForEntity(uri,params,MyClass.class); get restTemplate.getForEntity(uri,MyClass.class); get方法拼接参数 // request url String url = "https://google.com/search?q={q}"; // create an instance of RestTemplate RestTemplate restTemplate = new RestTemplate(); // make an HTTP GET request String html = restTemplate.getForObject(url, String.class, "java"); response.getBody(); 中文乱码问题: restTemplate....

May 21, 2023 · 1 min