@Autowired 根据类型注入
@Resource 默认根据名字注入,其次按照类型搜索
@Autowired @Qualifie(“oracleDataSourceImpl”) 两个结合起来可以根据名字和类型注入
直接上代码:
public interface IDataSource {
void print();
}
@Service
public class MysqlDataSourceImpl implements IDataSource {
@Override
public void print() {
System.out.println("MysqlDataSource......");
}
}
@Service
public class OracleDataSourceImpl implements IDataSource {
@Override
public void print() {
System.out.println("OracleDataSource......");
}
}
1、一个接口,有两个实现类,我们使用Autowire时,会直接报错:
@SpringBootTest(classes = Application.class)
public class DataSourceTest {
@Autowired
private IDataSource iDataSource;
@Test
public void test() {
iDataSource.print();
}
}
2、同样,我们把Autowire替换成Resource,也是报一样的错误的。
3、使用Autowire,但是把变量名称改成实现类中的名称,是不会报错的
@Autowired
private IDataSource oracleDataSourceImpl;
4、使用Resource代替上面的3中的Autowire,是不会报错的
6、使用Resource注解,指定实现类bean名称,是不会报错的
@Resource(name = "oracleDataSourceImpl")
private IDataSource iDataSource;
7、Qualifier需要和Autowire一起使用,在Qualifier中指定实现类bean名称,是不会报错的
注意,如果不写Autowire,是会报空指针异常的
@Autowired
@Qualifier("oracleDataSourceImpl")
private IDataSource iDataSource;
@Resource按照名字搜索会比@Autowire按照类型搜索快,而Qualifier和Autowired注解一起使用也能使用名字进行搜索,但是这种用的少,因为代码看起来比较多一些,通常情况下这些差距都基本上可以忽略吧,这里我们了解一下这些基本的使用就行,自己觉得哪个好用用哪个。