
springCloud中@Qualifier用处,处理注入不准确的问题
@Qualifier用处
@Qualifier作用为限定描述符,用于细粒度选择候选者,就是注入的时候可能发现有多个可注入对象,比如说一个Service接口有3个实现类,分别为impl1,impl2,impl3,你注入service的时候注入的是接口,那么就可以通过@Qualifier(“你要注入的bean的名称”)来选择注入对象。
例子如下:
package com.springCloud; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.config.DbConfigBean; import com.irisian.sharedjdbc.SessionFactory; import com.irisian.sharedjdbc.rule.DbConfig; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.ComponentScan; /** * Hello world! * */ @Controller @EnableAutoConfiguration @SpringBootApplication @EnableDiscoveryClient @EnableConfigurationProperties({DbConfigBean.class}) @ComponentScan(value = {"com.*","com.irisian.sharedjdbc.rule.*"}) public class App { @Autowired @Qualifier("dataSource1") private DataSource dataSource1; @Autowired @Qualifier("dataSource2") private DataSource dataSource2; @Autowired private DbConfigBean dbConfigBean; @RequestMapping("/") @ResponseBody public String index(){ System.out.println(dataSource1.equals(dataSource2)); return "hahahaha "+dbConfigBean.getDbName(); } public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
具体配置类如下(有两个都是创建DataSource的,依据配置application-test.yml):
server: port: 8084 spring: datasource1: url: jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC username: ${dbName} password: ${dbPassword} driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource datasource2: url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC username: ${dbName} password: ${dbPassword} driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource0
package com.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.lang.reflect.Array; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @Configuration public class DruidConfig1 { @Primary @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource1") public DataSource dataSource1(){ return DataSourceBuilder.create().build(); } }
package com.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.lang.reflect.Array; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @Configuration public class DruidConfig2 { @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource2") public DataSource dataSource2(){ return DataSourceBuilder.create().build(); } }