文章目录
- 前言
- 一、@Autowired注入
- 1. 属性注入
- 2. 构造方法注入
- 3. set方法注入
- 4. 形参注入
- 5. byName注入
- 5.1 新增实现类
- 5.2 注入
- 二、@Resource
- 1.引入库
- 2.使用
- 2.1 根据注解的name值注入
- 2.2 根据对象变量名注入
- 2.3 根据对象类型注入
- 总结
前言
【第8章】全注解开发
介绍了全注解开发,有使用到@Autowired注解,关于它为什么要单独开一章呢,因为它太重要了,还经常拿来和@Resource做对比。
一、@Autowired注入
本章内容基于前面章节基础,基于不重复造轮子理论,只提供样例代码
@Autowired根据对象的类型去容器中查找:
- 未找到,会抛出异常
- 找到一个,完成注入
- 存在多个,注入失败,抛出异常
1. 属性注入
package org.example.autowired.controller;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
/**
* Create by zjg on 2024/4/5
*/
@Controller
public class UserController {
//属性注入
@Autowired
UserService userService;
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
2. 构造方法注入
package org.example.autowired.controller;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
/**
* Create by zjg on 2024/4/5
*/
@Controller
public class UserController {
//构造方法注入
UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
3. set方法注入
package org.example.autowired.controller;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
/**
* Create by zjg on 2024/4/5
*/
@Controller
public class UserController {
//set方法注入
UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
4. 形参注入
package org.example.autowired.controller;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
/**
* Create by zjg on 2024/4/5
*/
@Controller
public class UserController {
//形参注入
UserService userService;
public UserController(@Autowired(required = false) UserService userService) {
this.userService = userService;
}
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
5. byName注入
5.1 新增实现类
UserService 是一个接口,有UserServiceImpl和AdminServiceImpl 两个实现类
package org.example.autowired.service.impl;
import org.example.autowired.dao.UserDao;
import org.example.autowired.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Create by zjg on 2024/4/5
*/
@Service
public class AdminServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public void addUserService() {
System.out.println("执行...AdminServiceImpl");
userDao.addUserDao();
}
}
5.2 注入
package org.example.autowired.controller;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
/**
* Create by zjg on 2024/4/5
*/
@Controller
public class UserController {
//byName注入
@Autowired
@Qualifier(value = "adminServiceImpl")
UserService userService;
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
二、@Resource
自从oracle收购了sun公司,搞出了一堆幺蛾子,java跟长了腿似的,版本蹭蹭往上涨,指不定后面还有收费
@Resource注解在JDK1.8中是自带的,JDK17中已经不再提供了,需要我们单独去下载,没办法整呗
1.引入库
<!-- https://mvnrepository.com/artifact/jakarta.annotation/jakarta.annotation-api -->
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.1.1</version>
</dependency>
2.使用
2.1 根据注解的name值注入
import jakarta.annotation.Resource;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Resource(name="userServiceImpl")
UserService userService;
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
2.2 根据对象变量名注入
import jakarta.annotation.Resource;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Resource
UserService userServiceImpl;
public void addUser(){
System.out.println("执行...UserController");
userServiceImpl.addUserService();
}
}
2.3 根据对象类型注入
根据类型注入,需要保证只有一个实现类被匹配到,否则会抛出异常
import jakarta.annotation.Resource;
import org.example.autowired.service.UserService;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Resource
UserService userService;
public void addUser(){
System.out.println("执行...UserController");
userService.addUserService();
}
}
总结
回到顶部
官方网站
官方文档
视频学习
个人感觉@Resource的匹配机制要更灵活一些,两者除了使用方式和匹配机制不同,基本上都能满足业务需要,具体使用哪个看项目而定吧,项目中大量使用哪个咱们就用哪个,如果是新项目需要使用到spring框架那就用@Autowired,毕竟是自家产品兼容性可能更好一些,其他情况完全可以用@Resource。