@Qualifier 注解作用就是为了给Bean打上一个标记,用来查找bean,代码示例:
- 创建一个java bean
package com.gupaoedu.springcloud.example.demo;
public class TestClass {
private String name; // getter setter 略
}
- 编写配置类,将这个bean装载到IOC容器
package com.gupaoedu.springcloud.example.demo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TestConfiguration {
@Bean("testClass1")
TestClass testClass1(){
return new TestClass("TestClass1");
}
@Qualifier
@Bean("testClass2")
TestClass testClass2(){
return new TestClass("TestClass2");
}
}
- 启动类,配置扫描包
package com.gupaoedu.springcloud.example.springclouduserservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = "com.gupaoedu")
@SpringBootApplication
public class SpringCloudUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudUserServiceApplication.class, args);
}
}
- 测试controller 对testClassList 加上@Qualifier注解
package com.gupaoedu.springcloud.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
@RestController
public class TestController {
@Qualifier
@Autowired
List<TestClass> testClassList= Collections.emptyList();
@GetMapping("/test")
public Object test(){
return testClassList;
}
}
然后启动,访问/test, 看到只打印了 TestClass2
然后对testClass1 Bean的注入,也加上@Qualifier注解后再请求/test
@Qualifier
@Bean("testClass1")
TestClass testClass1(){
return new TestClass("TestClass1");
}
结果如下,可以看到,只有加了@Qualifier标记的Bean, 才会被注入给同样加了@Qualifier标记的 testClassList 这个list中
注: 本文是为了给ribbon负载均衡原理中, @LoadBalanced注解实现负载均衡的原理做铺垫;