2者都可以用来装配bean,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
1.
@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
当一个接口有2个实现的情况:
举例:
一个接口:
public interface UserDao {
public void insert();
}
实现1:
@Repository("userJdbcDao")
public class UserJdbcDao implements UserDao{
@Override
public void insert() {
System.out.println("我是-jdbc-Dao-实现插入操作");
}
}
实现2:
@Repository("userJndiDao")
public class UserJndiDao implements UserDao{
@Override
public void insert() {
System.out.println("我是-jndi-Dao-实现插入操作");
}
}
service类:
@Service("userService")
public class UserService {
@Autowired
@Qualifier("userJdbcDao")
private UserDao userDao=null;
public void createUser(){
userDao.insert();
}
}
1.此时ide 会检测出你注入的Dao不是唯一,可以采用@Qualifier注解配合使用,指定你要注入哪个dao
2.也可以在实现接口的类上使用:
@Primary 出现冲突时候优先使用哪个实现类
推荐使用:@Resource:
实现类:@Repository(“userJdbcDao”)和service的@Resource(name=“userJdbcDao”) 一定要保持一致
UserJdbcDao 实现类名不一样也不影响
@Repository("userJdbcDao") //生命beanId
public class UserJdbcDao implements UserDao{
@Override
public void insert() {
System.out.println("我是-jdbc-Dao-实现插入操作");
}
}
@Service("userService")
public class UserService {
@Resource(name="userJdbcDao")
private UserDao userDao=null;
public void createUser(){
userDao.insert();
}
}
@SpringBootTest
class TestApplicationTests {
@Resource(name="userService")
private UserService userService;
@Test
public void testcreateUser(){
userService.createUser();
}
}
代码:
测试代码源码地址
文章来自于It老齐001
本文详细介绍了Spring框架中@Autowired和@Resource注解的差异。在接口有多个实现时,@Autowired配合@Qualifier用于指定具体实现,而@Resource默认按名称装配,可通过name属性指定。当存在多个实现时,可以使用@Primary标记主要实现,或者通过@Resource的name属性精确匹配。同时,示例代码展示了如何在测试类中注入并调用Service层的方法。

3935

被折叠的 条评论
为什么被折叠?



