下面我就来详细讲解一下 “一文搞懂Spring中@Autowired和@Resource的区别”的完整攻略。
1. 背景知识
在讲解 @Autowired 和 @Resource 之前,我们先来简要了解一下Spring中的IOC和DI。IOC(Inversion of Control),即控制反转,是指将创建对象的主动权交给Spring框架,由Spring框架来创建对象和管理对象之间的依赖关系。DI(Dependency Injection),即依赖注入,是指将对象所需的依赖关系通过注入的方式来完成的。Spring中使用注解的方式来实现依赖注入,其中 @Autowired 和 @Resource 就是Spring常用的两个注解。
2. @Autowired注解
@Autowired 是 Spring 提供的注解之一,通过 @Autowired 注解可以完成自动装配功能,它是按照类型自动装配的。
2.1 自动装配类型
@Autowired 注解有两种自动装配类型:
- by Type:按照类型自动装配
- by Name:按照名称自动装配
其中,按照类型自动装配是默认选择的方式,如果要按照名称自动装配,则需要通过 @Qualifier 注解指定要装配的实例名称。
2.2 示例说明
接下来我们通过实例来说明 @Autowired 的使用。
首先,我们定义两个接口:
public interface IStudent {
void study();
}
public interface ITeacher {
void teach();
}
然后,创建两个实现类:
@Component("student1")
public class Student implements IStudent {
@Override
public void study() {
System.out.println("学生正在学习...");
}
}
@Component("teacher1")
public class Teacher implements ITeacher {
@Override
public void teach() {
System.out.println("老师正在讲课...");
}
}
在代码中,@Component("student1") 表示将 Student 类注入Spring容器,并取一个别名为 student1。@Component("teacher1") 同理。
接下来,我们通过 @Autowired 注解将 IStudent 接口注入到 ITeacher 接口中。
@Service
public class TeacherService {
@Autowired
private IStudent student;
public void teach() {
student.study();
System.out.println("老师正在讲课...");
}
}
在代码中,@Service 注解表示将 TeacherService 类注入Spring容器。
最后,我们来验证一下:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TeacherService teacherService = (TeacherService) context.getBean("teacherService");
teacherService.teach();
}
运行结果如下:
学生正在学习...
老师正在讲课...
从结果可以看出,TeacherService 类成功注入了 IStudent 接口,并成功调用了 Student 类中的 study() 方法,说明 @Autowired 注解的使用是正确的。
3. @Resource注解
@Resource 是 JSR-250 规范中的注解,也是Spring提供的注解之一,通过 @Resource 注解可以完成自动装配功能,它是按照名称自动装配的。
3.1 自动装配类型
@Resource 注解有两种自动装配类型:
- by Name:按照名称自动装配
- by Type:按照类型自动装配
其中,按照名称自动装配是默认选择的方式,如果要按照类型自动装配,则需要通过 @Resource 的 type 属性指定要装配的类型。
3.2 示例说明
接下来我们通过实例来说明 @Resource 的使用。
首先,我们创建一个接口:
public interface IHello {
void sayHello();
}
然后,创建两个实现类:
@Service
public class HelloChina implements IHello {
@Override
public void sayHello() {
System.out.println("你好,中国!");
}
}
@Service
public class HelloAmerica implements IHello {
@Override
public void sayHello() {
System.out.println("Hello, America!");
}
}
在代码中,@Service 表示将 HelloChina 和 HelloAmerica 类注入Spring容器。
接下来,我们在一个新的类中使用 @Resource 注解来进行自动装配,并指定要装配的名称。
@Service
public class HelloService {
@Resource(name = "helloChina")
private IHello hello;
public void sayHello() {
hello.sayHello();
}
}
在代码中,@Service 表示将 HelloService 类注入Spring容器。
最后,我们来验证一下:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloService helloService = (HelloService) context.getBean("helloService");
helloService.sayHello();
}
运行结果如下:
你好,中国!
从结果可以看出,HelloService 类成功注入了 HelloChina 类,并成功调用了 HelloChina 类中的 sayHello() 方法,说明 @Resource 注解的使用是正确的。
4. 总结
通过对 @Autowired 和 @Resource 进行详细的讲解和示例说明,我们可以得出如下结论:
- @Autowired 是按照类型自动装配的,而 @Resource 是按照名称自动装配的;
- @Autowired 默认按照类型自动装配,如果要按照名称自动装配,则需要通过 @Qualifier 注解指定要装配的实例名称;
- @Resource 默认按照名称自动装配,如果要按照类型自动装配,则需要通过 @Resource 的 type 属性指定要装配的类型;
- 两种注解的使用场景不同,应根据实际需要进行选择。
希望本文对大家对于 @Autowired 和 @Resource 的区别有所了解,谢谢!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Spring中@Autowired和@Resource的区别 - Python技术站