关于spring的依赖注入问题
关于spring的依赖注入问题
spring 的依赖注入有三种方式:
-
属性注入(Field Injection)
这种注入方式就是在bean的变量上使用注解进行依赖注入。 @Autowired 的一大使用场景就是属性注入,它的本质其实是通过java反射机制来实现的,所以private成员变量也可以被注入具体对象。
@Controller public class UserController { @Autowired private UserService userService; }
-
构造器注入(Constructor Injection)
将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。
@Controller public class UserController { private final UserService userService; public UserController(UserService userService){ this.userService = userService; } }
-
set 方法注入(Setter Injection)
Setter Injection
也会用到@Autowired
注解,但使用方式与Field Injection
有所不同,Field Injection
是用在成员变量上,而Setter Injection
的时候,是用在成员变量的Setter函数上。
@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
}
使用@Resource
代替@Autowired
@Resource
有2个属性name和type。在spring中name属性定义为bean的名字,type这是bean的类型。如果属性上加@Resource
注解那么他的注入流程是
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常。
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
如果既没有指定name,又没有指定type,则默认按照byName方式进行装配;如果没有匹配,按照byType进行装配。
@Autowired
只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier
或@Primary
注解一起来修饰。
使用@RequiredArgsConstructor
构造器方式注入
这种形式就是Spring推荐使用的构造器方式注入,此种方式是lombok包下的注解,如果使用此种方式,需要项目中引入lombok,
@RequiredArgsConstructor
public class UserDaoImpl{
private final User user;
}
以上都是我的思考和查询资料所得,仅作为自我学习的记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人