经过工作中的开发经验可以用一句话进行总结其区别与联系:
@autowired与@resource就只是默认的装配类型不一致,@autowired默认byType注入,如果找不到byType(也就是一个接口的实现类有多个),那么就按照byName注入。@resource是默认按照byName注入,当byName找不到的时候,则按照byType注入。代码如下:
@autowired示例
@Component
public class IndexDaoImpl implements IndexDao {
@Override
public void test() {
System.out.println("IndexDaoImpl");
}
}
@Component
public class IndexDaoImpl2 implements IndexDao {
@Override
public void test() {
System.out.println("IndexDaoImpl2");
}
}
service示例:
@Component
public class IndexServicelImpl implements IndexServicel {
@Autowired
IndexDao indexDaoImpl;
@Override
public void test() {
indexDaoImpl.test();
}
}
使用java config方式执行结果为:打印出indexDaoImpl
结论:当@autowired如果找不到byType(也就是一个接口的实现类有多个),那么就按照byName注入。
@resource示例
@Component
public class IndexServicelImpl implements IndexServicel {
// @Autowired
@Resource
IndexDao indexDaoImpl;
@Override
public void test() {
indexDaoImpl.test();
}
}
使用java config方式执行结果为:打印出indexDaoImpl
继续修改代码:
@Component
public class IndexServicelImpl implements IndexServicel {
// @Autowired
@Resource
IndexDao indexDaoImpl2;
@Override
public void test() {
indexDaoImpl2.test();
}
}
使用java config方式执行结果为:打印出indexDaoImpl2
继续修改代码:
@Component
public class IndexServicelImpl implements IndexServicel {
// @Autowired
@Resource
IndexDao indexDaoImpl211;
@Override
public void test() {
indexDaoImpl211.test();
}
}
结果报错。
将IndexDaoImpl注释,只保证indexDao的实现类只有一个,则结果不报错,输出:IndexDaoImpl2
结论:@resource是默认按照byName注入,当byName找不到的时候,则按照byType注入。